0

コードベースには、次のような形式のループがいくつか含まれていますwhile((*assignment*) *condition*)

while((c = *s++) != '\0') {...}

while((i = getNext()) != NULL) {...}

残念ながら、これらにより、コンパイラは「条件内の割り当て」警告を発しますが、これは取り除きたいと考えています。私の計画は、ループを for(割り当て;条件;割り当て)の形式のwhileループに変換することです。たとえば、次のようになります。for

for(c = *s++; c != '\0'; c = *s++) {...}

for(i = getNext(); i != 0; i = getNext()) {...}

この変換は有効ですか? より良い代替手段はありますか?

4

4 に答える 4

0

ループに関する私の理解が正しければ、変換は完全に有効ですが、この変換は while ループよりもはるかに読みにくいようです。ループの前に初期化を行い、whileループの最後でインクリメントして警告を取り除きます。

c = *s++;
while(c != '\0') 
{
    ...
    c = *s++;
}
于 2013-04-26T00:15:38.540 に答える
0

コンパイラが何であるかは述べていませんが、高品質のコンパイラであれば、そのような警告をオフにすることができます。しかし、それを管理できない場合:

for(;;)
{
    c = *s++;
    if (c == '\0') break;
    ...
}

は同等であり、より一般的です。同じく:

for(;;)
{
    i = getNext();
    if (!i) break;
    ...
}

多くの場合、最初のものよりも優れています (ただし同等ではありません)。

for(;; s++)
{
    c = *s;
    if (c == '\0') break;
    ...
}

これらはより冗長で醜いですが、脆弱でエラーが発生しやすいコードを繰り返す変換よりもはるかに優れています。

于 2013-04-26T01:23:37.450 に答える