提问人:Utkarsh Kumar 提问时间:8/31/2023 最后编辑:Utkarsh Kumar 更新时间:8/31/2023 访问量:103
无限for循环if条件[duplicate]
Infinite for loop if condition [duplicate]
问:
代码片段 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++) 会产生如此大的差异?
答:
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<5
i<2
评论
i
i
i