无限for循环if条件[duplicate]

Infinite for loop if condition [duplicate]

提问人:Utkarsh Kumar 提问时间:8/31/2023 最后编辑:Utkarsh Kumar 更新时间:8/31/2023 访问量:103

问:

代码片段 1:

int i=1;
for(;;){
    if (i<5){
        cout<<"Hello World"<<endl;
        i++;
    }
}

代码片段 2:

int i=1;
for(;;){
    if (i<5){
        cout<<"Hello World"<<endl;
    }
    i++;
}

代码段 1 生成一个输出,其中“Hello World”被打印了 4 次,然后循环继续,没有输出,这是预期的。但是,“Hello World”在片段 2 中无限期打印。为什么即使在 i=>5 之后,条件 (i<5) 仍未在代码段 2 中选中?在这些代码段中,在 if 块内部或外部递增 i (i++) 会产生如此大的差异?

C++ if 语句 无限循环

评论

3赞 Jerry Coffin 8/31/2023
当达到其最大值并再次增加它时会发生什么?i
2赞 molbdnilo 8/31/2023
在第二种情况下,will 溢出,这使得程序未定义。(同时打印 的值。ii
0赞 Utkarsh Kumar 8/31/2023
@molbdnilo我也检查了打印。它会无限期地打印。您能否解释一下有关溢出和程序不定义的更多信息。
1赞 molbdnilo 8/31/2023
在一本好书中阅读有关未定义行为的信息。
1赞 Jesper Juhl 8/31/2023
代码具有未定义的行为。任何事情都可能发生。

答:

1赞 Serge Ballesta 8/31/2023 #1

在第一个代码段中,当达到值 5 时,它不再更改并保留该值。i

在第二个中,不断增加。它将溢出,这足以调用 Undefined Behavior。常见的实现使用 2 补码表示负数,因此 INT_MAX + 1 给出...负数 (INT_MIN)。这确实小于 5!i

评论

5赞 You 8/31/2023
此外,由于前向进度保证,两个循环都是 UB。
0赞 Jean-Baptiste Yunès 8/31/2023
@You但这些循环是 I/O 的,所以会产生可观察的行为,不是吗?
0赞 You 8/31/2023
@Jean-BaptisteYunès 是的,但一旦他们这样做了,他们就会停止按照标准的定义“取得进展”。非正式地说,这两个程序在语义上等同于一个带有 I/O 输出的有限循环,然后是一个没有 I/O 的无限循环;后一个循环违反了前向进度保证。
0赞 Jean-Baptiste Yunès 8/31/2023
@you我理解这一点,但要求编译器能够进行这种消除,很难相信这是编译器推断出来的(即使在这种情况下这几乎是微不足道的)。
0赞 You 9/1/2023
@Jean-BaptisteYunès:编译器可能推断的内容并不真正相关;循环停止向前推进,因此它是 UB。在这种特殊情况下,与 发生“工作”(无限循环没有被优化出来),但突然间循环被完全消除:godbolt.org/z/KaG63E7c7i<5i<2