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

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. 
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; realpart of 4i is 0, imaginarypart 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>
.