9

コードについては、

while(1)
{
   /* ..... */
}

MSVC は次の警告を生成します。

warning C4127: conditional expression is constant

警告のMSDNfor(;;)ページは、代わりに使用することを提案していますwhile(1)。どのような利点for(;;)があり、なぜそれが常に使用されていることを警告しているのか疑問に思っていwhileます。

同じ警告を得るには、GCC でどのフラグを使用すればよいですか?

4

2 に答える 2

14

多くの場合、定数条件は単純なバグで十分です。このことを考慮:

unsigned k; 
...
while (k>=0) 
{
 ...
}

k>=0k が符号付き int の場合、この条件は意味がありますが、unsigned の場合は意味がありません。不注意な開発者は、k が符号なしと宣言されたことを忘れ、負の数として使用できるかのように使用します。while(1)コンパイラは役に立ち、これについて警告し、コンパイラを同じ問題クラスに分類しようとします 。for(;;)明確に「永久にループする」ことを意味するため、

于 2010-08-16T05:37:14.587 に答える
9

for(;;)前者は無限ループとして定義さwhile (true)れた特別なケースであるのに対し、後者は「真、常に」という一種の乱用であるという点で異なります。

警告が表示されるのは、不要な無限ループがかなり悪いためです。最初の兆候で無限ループがある可能性があることを警告していますしかし、 を使用するfor(;;)ことで、「これを永遠にループする」とほぼ明示的に言ったことになり、警告する必要はありません。

GCCに同等の警告があるとは思いません。

于 2010-08-16T05:36:51.373 に答える