这是C语言中的那行代码。
这里的循环条件是++i。
那么编译器如何决定考虑哪个条件,因为这里其他两个作为条件出现?
char i=0;
for(i<=5&&i>-1;++i;i>0)
printf("%d",i);
输出
1234..127-128-127....-2-1
这是C语言中的那行代码。
这里的循环条件是++i。
那么编译器如何决定考虑哪个条件,因为这里其他两个作为条件出现?
char i=0;
for(i<=5&&i>-1;++i;i>0)
printf("%d",i);
输出
1234..127-128-127....-2-1
该for
语句的工作方式如下:
for (X; Y; Z)
{
...
}
翻译成
X;
while (Y)
{
...
Z;
}
所以你的代码从:
char i=0;
for(i<=5&&i>-1;++i;i>0)
printf("%d",i);
至:
char i = 0;
i<=5 && i>-1; // X
while (++i) // Y
{
printf("%d", i);
i > 0; // Z
}
如您所见,标有X
和Z
的行完全没用。所以:
char i = 0;
while (++i)
printf("%d", i);
这意味着它将从 1 打印到结果++i
为零时。
如果char
在您的编译器中签名,则行为留给实现,即使它很可能会溢出到负值并工作到零。
如果char
为正,这将打印正值,直到它溢出回 0。
这里的循环终止条件是++i。这没有什么神秘之处。当我达到 0 时循环将停止(因为它将是“假”)
它没有。它运行第一部分并i
设置为任何副作用,然后在第二部分为假时终止,在这种情况下i
为 0,然后在每个循环中运行第三部分。
所以编译器基本上将其重写为:
char i=0;
i<=5&&i>-1;
do {
printf("%d",i);
i>0;
} while ( (++i) != 0)
提示:记住 char 是有符号的和二进制补码,所以我会去 1,2,3....128,-127,-126.... 0