質問の歴史:
カンマ演算子は、C言語において、構文が単一の式を要求するところで複数の式を1行にまとめるために導入されました。これにより、コンパクトな記述が可能となり、時には余分な補助的コードブロックを避けることもできます。
問題:
カンマ演算子は、関数の引数の区切り文字と混同されることが多いです。主な特性は、両方のオペランドを左から右に評価しますが、最後の値のみが返されることです。副作用のある複雑な式では、計算順序のために予期しない結果が得られる可能性があります。
解決策:
カンマ演算子は、意味的に妥当な場合、たとえばforループで複数の変数を初期化する際など、意識的に使用するべきです。副作用のある複雑な式をカンマ演算子内で使用することは避け、可読性を損なわず不安定な動作を引き起こさないようにしましょう。
コード例:
#include <stdio.h> int main() { int a = 1, b = 2, c; c = (a += 5, b *= 2); // a=6, b=4, c=4 printf("a=%d b=%d c=%d\n", a, b, c); for (int i = 0, j = 10; i < j; i++, j--) { printf("i=%d j=%d\n", i, j); } return 0; }
主な特徴:
カンマは関数の引数リストで演算子として使用できますか? それはカンマ演算子として機能しますか?
いいえ、関数のパラメータリストでカンマは単なる区切りです。演算子は式内でのみ機能します。
return内のカッコ内でカンマ演算子を使用した場合、return (x++, y);はどうなりますか?
yの値が返され、xは1増加しますが、返された値はx++の結果ではありません。
カンマ演算子は関数引数の計算順序に影響しますか?
カンマ演算子が引数内で使用されると、式は左から右に評価されますが、引数間の計算順序自体は標準で保証されていません。
開発者がreturn式の中でカンマ演算子を使用して複数のアクションを一度に実行します。
プラス:
マイナス:
リファクタリング後、アクションは個々の行に分けられました。
プラス:
マイナス: