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
Спробуйте останню за допомогою редактора забарвлення синтаксису ;-)