当我写下面的C代码时,我发现(与我所期望的相反),gcc可以接受这段代码并成功编译它!我不知道为什么,因为这似乎是一个错误的语句。
int main() {
int a = 1i;
return 0;
}
我猜它可能接受1i
作为复数。那么int a = 1i
意味着int a = 0+1i
,而1i
不是一个有效的整数,所以它只接受0
。
int main() {
int a = 1i*1i;
printf("%d\n",a);
return 0;
}
我试过上面的代码,发现它printa-1。也许我的想法是正确的。但这是我第一次发现C编译器可以做这项工作。我的猜测是正确的吗?
1条答案
按热度按时间xlpyo6sf1#
你的直觉是正确的。gcc允许复数常量作为扩展。
从gcc文档中:
要编写具有复杂数据类型的常量,请使用后缀
i
或j
(其中之一;例如,2.5fi
的类型为_Complex float
,3i
的类型为_Complex int
。这样的常量总是具有纯虚值,但是您可以通过将真实的常量加1来形成任何您喜欢的复数值。这是GNU扩展;如果您有符合ISO C99的C库(如GNU libc),并且希望构造浮点类型的复常量,则应包含<complex.h>并使用宏I
或_Complex_I
。所以
1i
是复数i。当你把它赋值给a
时,复数部分被截断,真实的部分被赋值(如果实数部分是浮点类型,它将被转换成int
)。此转换在C standard的第6.3.1.7p2节中详细说明:
将复数类型的值转换为真实的类型时,将丢弃复数值的虚部,并根据相应实数类型的转换规则转换实部的值。