why int a= 4i; not report an syntax error(c++)
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int a = 232u;
int b = 4i;
cout << a << endl << b;
}
I was review basic of cpp, As the screen shot I took, I tried to sign an unsigned int to a int which was fine, then I tried change that u to i and waiting for a error, but there's no error and output was 0. There's no define of i. So what happened.
I'm using xcode on mac, last picture is the build settings.
2 answers
-
answered 2017-06-17 18:49
Stargateur
C++ has a concept of literals, this is used to describe the type of a value. For example, integer literal can be used to write I want a integer
1
with a typeunsigned int
. We will write it1u
.In your case, your are probably using a GNU extension for imaginary constants. What you write don't compile in C++ standard.
The good way to use complex literal in C++ standard is to include include
<complex>
. And to usestd::complex_literals
, this is only possible in C++14. -
answered 2017-06-17 18:49
Stephan Lechner
The suffix
i
denotes the imaginary part of a complex number; when assigning an (implicitly) constructed complex number to integral value, only the real part is taken.Hence, the following expression yields
0
:int b = 4i; // gives 0; real-part of 4i is 0, imaginary-part is 4: casting to int gives the real part, i.e. 0
But:
int x = 4i*4i; // gives -16; as i means the square root of -1, i*i yields -1; so 4i*4i = -16
Note that this works even without including
<complex>
.