2i
является gcc
расширением комплексного целочисленного литерала, чисто мнимого числа, удвоенного квадратного корня из -1
. Это расширение также поддерживается clang
.
Несколько удивительно, что ваша компиляция с помощью gcc 5.4.0
дает опубликованный вывод сборки:
- При компиляции на http://gcc.godbolt.org/# я получаю ошибку компиляции из
gcc
5.3.0 http://gcc.godbolt.org/#
:: error: cannot convert '__complex__ int' to 'int' in return
.
- Опубликованный код сборки для функции
foo
неверен: он не возвращается 0
. Преобразование комплексной целочисленной константы 2i
в int
должно возвращать ее действительную часть 0
.
И наоборот, в clang
версии 3.7 он компилируется без предупреждения и генерирует оптимальный код, но, конечно, не то, что вы ожидаете:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Этот синтаксис можно комбинировать с другими суффиксами в любом порядке. Компиляция кода ниже clang -Weverything
дает мне соответствующие предупреждения warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
:
#include <stdio.h>
int main() {
printf("sizeof(2i) = %zd\n", sizeof(2i));
printf("sizeof(2ui) = %zd\n", sizeof(2ui));
printf("sizeof(2li) = %zd\n", sizeof(2li));
printf("sizeof(2lli) = %zd\n", sizeof(2lli));
printf("sizeof(2.i) = %zd\n", sizeof(2.i));
printf("sizeof(2.fi) = %zd\n", sizeof(2.fi));
printf("sizeof(2e0fi) = %zd\n", sizeof(2e0fi));
printf("sizeof(2e0i) = %zd\n", sizeof(2e0i));
printf("sizeof(2il) = %zd\n", sizeof(2il));
printf("sizeof(2ill) = %zd\n", sizeof(2ill));
printf("sizeof(2.if) = %zd\n", sizeof(2.if));
return 0;
}
Он производит такой вывод в моей среде:
sizeof(2i) = 8
sizeof(2ui) = 8
sizeof(2li) = 16
sizeof(2lli) = 16
sizeof(2.i) = 16
sizeof(2.fi) = 8
sizeof(2e0fi) = 8
sizeof(2e0i) = 16
sizeof(2il) = 16
sizeof(2ill) = 16
sizeof(2.if) = 8
Попробуйте последний вариант с помощью редактора раскраски синтаксиса ;-)