从GNU docs:
编写辅助数常数的简单方法是附加
后缀"i"或"I",或"j"或"J",为一个整数或浮点
常数例如,2.5fi
具有类型_Complex float
,3i
具有类型
_Complex int
.四个替代后缀字母都是等效的.标准C不支持后缀"i"或"j".
所以我们可以得出结论:
Clang也支持这个NU扩展.
编译-pedantic-errors
次失败:
$ gcc c.c -pedantic-errors -o c
c.c: In function 'main':
c.c:5:17: error: imaginary constants are a GCC extension
5 | int i = 1i;
| ^~
$ clang c.c -pedantic-errors -o c
c.c:5:17: error: imaginary constants are a GNU extension [-Werror,-Wgnu-imaginary-constant]
int i = 1i;
^
1 error generated.
另请参阅:What compiler options are recommended for beginners learning C?.
至于为什么i
变成了0:
来自6.3.1.7关于真实和复杂转换的ISO C Standard个部分:
当实类型的值转换为复合类型时,复合类型的实部分
结果值由转换为相应实类型的规则确定,并且复结果值的虚部是正零或无符号零.
当复类型的值转换为实类型时,会丢弃复值的虚部,并根据相应实类型的转换规则转换实部的值.
因此,当你将1i
分配给int
时,它就会变成0
,因为那是1i
的实部,而虚部被丢弃.
截至后缀a
、b
等,ISO C标准和GNU C标准都不支持任何此类内容.