-2

为什么以下循环不会无限次运行?我希望在达到 65535 时,i应该溢出回零。

#include<stdio.h>
int main()
{
    short int i = 0;  //(assume short int is 2 bytes)
    for(i<=5 && i>=-1; ++i; i>0)
        printf("%u\n", i);
    return 0;
}

编辑

那这个呢

#include<stdio.h>
int main()
{
    int x=1, y=1;
    for(; y; printf("%d %d\n", x, y))
    {
        y = x++ <= 5;
    }
    printf("\n");
    return 0;
}

它运行良好并打印

2 1
3 1
4 1
5 1
6 1
7 0

是什么让它终止?

4

5 回答 5

7

您在这里依赖签名溢出,它调用undefined behvaiour。编译器完全有权将其优化为无限循环,或者不优化,或者做一些完全不同的事情。

于 2013-09-15T09:40:10.723 回答
2

两个原因。

首先,正如 Oli Charlesworth 指出的那样,您正在调用未定义的行为。

然后, 65535 到 0 是一个无符号溢出,但是你有一个短(有符号) int,所以你(可能!)有一个从 32767 到 -32768的有符号溢出。所以你的if条件可能会失败。

i您作为未签名的打印仅在 内将其转换为未签名printf,从而使您无法意识到可能发生的事情。在我的系统上,我得到,没有优化,

...
32764
32765
32766
32767
4294934528 <-- this is -32768
4294934529 <-- this is -32767, we're going backwards...
4294934530
4294934531
...
4294967295 <-- and this is -1, and your condition fails, and the loop exits.

但是不能保证所有编译器和平台都会发生这种情况!

于 2013-09-15T09:47:17.563 回答
0

循环运行多少次取决于循环的决策部分,在 for 循环中,这部分是你放置的中间部分,++i 当溢出发生时你是对的,++i返回 0 和 0 的值在 C 中等于 false。所以循环终止。

试试这个,你的循环将无限运行。

#include<stdio.h>
int main()
{
    short int i = 0;  //(assume short int is 2 bytes)
    for(i<=5 && i>=-1; ;++i  )
        printf("%u\n", i);
    return 0;   
}
于 2013-09-15T09:47:44.143 回答
0

您是依靠short int的限制来限制值而不是自己定义限制吗?这是非常糟糕的做法,因为编译器没有关于处理超出其界限的值的规则。一个聪明的编译器一旦溢出就会简单地抛出一个错误。不要那样做。

为什么你还想要一个无限循环?

于 2013-09-15T09:48:40.250 回答
0

您的条件语句是++i,当它返回 0 时,您的循环终止。i > 0什么都不做,你的 for 循环初始化程序什么也不做。你的 for循环相当于

for( ; (++i) != 0; )
于 2013-09-15T10:07:05.567 回答