发出"while(true)"的编译器警告而不是为"for(;;)"发出一个警告的重点是什么?

sha*_*oth 10 c++ compiler-construction compiler-warnings visual-c++

当我使用带有"警告级别4"的Visual C++ 9编译C++代码时,如下所示:

while( true ) {
   //loop body with break on certain condition
}
Run Code Online (Sandbox Code Playgroud)

以下内容:

for( ; true; ) {
   //same loop body
}
Run Code Online (Sandbox Code Playgroud)

两者都触发C4127: conditional expression is constant警告,但以下内容:

for( ; ; ) {
   //same loop body
}
Run Code Online (Sandbox Code Playgroud)

编译时没有警告.

为什么会出现这种差异,尤其是第二种和第三种变体之间?

Tal*_*man 10

警告用户持续条件表达式的原因是为了帮助避免表达式最终为常量的错误(例如,由于拼写错误).在最后一种情况下,没有表达式,因此不存在意外不变的风险.


Mat*_* M. 7

原因很简单,虽然很愚蠢.

诊断无限循环很重要,但这可能不明显:

while(i >= 0) { --i; } // infinite if i unsigned

while(SOME_MACRO(i)) // err, depends on the expansion of macros
Run Code Online (Sandbox Code Playgroud)

编译器的一个很好的特性是为重复测试产生警告,即测试结果总是为真或总是为假,因为当它来自宏扩展或在依赖的上下文中时并不明显.

似乎VC++在这里推得太过分了,而不是考虑同义反复条件警告它可以找到的所有truefalse条件,即使它们已经在代码中明确说明了.