why int a= 4i; not report an syntax error(c++)

enter image description here

#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 type unsigned int. We will write it 1u.

    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 use std::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>.