为什么gcc接受“int a = 3 i;“作为一个有效的声明?

56lgkhnf  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(147)

当我写下面的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编译器可以做这项工作。我的猜测是正确的吗?

xlpyo6sf

xlpyo6sf1#

你的直觉是正确的。gcc允许复数常量作为扩展。
从gcc文档中:
要编写具有复杂数据类型的常量,请使用后缀ij(其中之一;例如,2.5fi的类型为_Complex float3i的类型为_Complex int。这样的常量总是具有纯虚值,但是您可以通过将真实的常量加1来形成任何您喜欢的复数值。这是GNU扩展;如果您有符合ISO C99的C库(如GNU libc),并且希望构造浮点类型的复常量,则应包含<complex.h>并使用宏I_Complex_I
所以1i是复数i。当你把它赋值给a时,复数部分被截断,真实的部分被赋值(如果实数部分是浮点类型,它将被转换成int)。
此转换在C standard的第6.3.1.7p2节中详细说明:
将复数类型的值转换为真实的类型时,将丢弃复数值的虚部,并根据相应实数类型的转换规则转换实部的值。

相关问题