这是C.的代码行
循环的条件是++ i。
那么编译器如何决定考虑哪个条件,因为其他两个条件出现?
char i=0;
for(i<=5&&i>-1;++i;i>0)
printf("%d",i);
输出
1234..127-128-127....-2-1
答案 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
}
如您所见,标有X
和Z
的行完全没用。因此:
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时,循环将停止(因为它将是'假')