1

这是C语言中的那行代码。
这里的循环条件是++i。
那么编译器如何决定考虑哪个条件,因为这里其他两个作为条件出现?

char i=0;
for(i<=5&&i>-1;++i;i>0)
    printf("%d",i);

输出

1234..127-128-127....-2-1
4

3 回答 3

3

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
}

如您所见,标有XZ的行完全没用。所以:

char i = 0;
while (++i)
    printf("%d", i);

这意味着它将从 1 打印到结果++i为零时。

如果char在您的编译器中签名,则行为留给实现,即使它很可能会溢出到负值并工作到零。

如果char为正,这将打印正值,直到它溢出回 0。

于 2012-07-27T15:50:15.547 回答
0

这里的循环终止条件是++i。这没有什么神秘之处。当我达到 0 时循环将停止(因为它将是“假”)

于 2012-07-27T15:54:33.640 回答
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

于 2012-07-27T15:49:54.870 回答