はい、注意事項があります。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-value
Mike Seymours の引用が強調表示されたマニュアルの完全なエントリを次に示します。
ステートメントが明示的に使用されていない結果を計算するたびに警告します。この警告を抑制するには、未使用の式を void にキャストします。これには、副作用を含まない式ステートメントまたはコンマ式の左側が含まれます。たとえば、x[i,j] のような式は警告を発しますが、x[(void)i,j] は警告を発しません。