为什么我看到人们更多地使用 for(;;) 而不是 while(1) 来进行无限循环?

Why do I see people use for(;;) more than while(1) for infinite loops?

我发现 for(;;) 在野外的使用频率比 while(1) 高得多,我很好奇这是否有任何有意义的原因。使用带有 -O0 优化的 GCC 进行编译,这两个语句都会产生一条跳转指令。它不仅仅是一种编码风格吗?是否有任何编码标准表明 for(;;) 优于 while(1)?我缺少一些效率原因吗?我意识到目标通常是使代码尽可能地具有可读性,但就可读性而言,我认为这两种风格之间没有太大区别,无法保证在使用上存在如此明显的差异。

while(1) 涉及一个常量,在没有优化的情况下编译时可能会导致开销,例如压入 1 并检查表达式是 z,n 还是正数。

MSVC 演示 while(1) https://godbolt.org/z/MMMT9n

$LN2@main:
    mov eax, 1
    test eax, eax
    je SHORT $LN1@main
    jmp SHORT $LN2@main
$LN1@main:

for(;;)

$LN4@main:
    jmp SHORT $LN4@main

对于一些较旧的编译器,例如更新 3 之前的 Microsoft Visual Studio 2015,while(1) 构造将触发有关条件表达式为常量的警告,请参阅 Remarks section for warning C4127

十多年前有人在 Stack Overflow 上问过相关问题,请参阅 Why MSVC generates warning C4127 when constant is used in “while”

我记得在我们使用 Visual Studio 2012 的日子里偶然发现了这个问题。现在,这似乎已经解决了,但是 for(;;) 形式对我来说似乎更惯用.