9

カンマ演算子は使用しません。
しかし、時々、再帰を書くとき、私はばかげた間違いをします:私は関数名を忘れます。そのため、再帰呼び出しの結果ではなく、最後のオペランドが返されます。

簡略化した例:

int binpow(int a,int b){
    if(!b)
        return 1;
    if(b&1)
        return a*binpow(a,b-1);
    return (a*a,b/2); // comma operator
}

正しくない、デバッグが難しいコードではなく、コンパイルエラーが発生する可能性はありますか?

4

2 に答える 2

21

はい、注意事項があります。gcc に-Wunused-value警告 (または のエラー-Werror) があります。効果がないため、これはあなたの例で有効になりますa*a。コンパイラ結果:

test.cpp: In function ‘int binpow(int, int)’:
test.cpp:6:43: warning: left operand of comma operator has no effect [-Wunused-value]

ただし、これは単一引数の呼び出しと、すべての引数に副作用がある呼び出し ( など++) をキャッチしません。たとえば、最後の行が次のようになっている場合

return (a *= a, b/2);

コンマ ステートメントの最初の部分は変更の効果があるため、警告はトリガーされませんa。これはコンパイラ (後で使用されないローカルの非揮発性変数の割り当て) で診断可能であり、おそらく最適化によって取り除かれますが、それに対する gcc の警告はありません。

参考までに、-Wunused-valueMike Seymours の引用が強調表示されたマニュアルの完全なエントリを次に示します。

ステートメントが明示的に使用されていない結果を計算するたびに警告します。この警告を抑制するには、未使用の式を void にキャストします。これには、副作用を含まない式ステートメントまたはコンマ式の左側が含まれます。たとえば、x[i,j] のような式は警告を発しますが、x[(void)i,j] は警告を発しません。

于 2011-11-15T16:52:43.870 に答える
2

gccでは、-Wunused-valueを指定できます。これは、コンマ演算子のLHSに副作用がない場合に警告します。

于 2011-11-15T16:57:28.900 に答える