在for循环中交换语句

时间:2012-07-27 15:22:32

标签: c

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

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

输出

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

3 个答案:

答案 0 :(得分: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的位置。

答案 1 :(得分:0)

没有。它运行第一部分,i设置为此的任何副作用,然后当第二部分为假时终止,在这种情况下i为0,然后在每个循环运行第3部分一部分。

所以编译器基本上将其重写为:

char i=0;
i<=5&&i>-1;
do {
     printf("%d",i);
     i>0;
} while ( (++i) != 0)

提示:记住char是签名和二进制补码,所以我会去1,2,3 .... 128,-127,-126 .... 0

答案 2 :(得分:0)

这里的循环终止条件是++ i。关于它没有任何神秘感。当我命中0时,循环将停止(因为它将是'假')