次のコードを検討してください。
int i;
i = 1,2,3,4,5;
printf("First time i = %d\n",i);
i = (1,2,3,4,5);
printf("Second time i = %d\n",i);
出力:
初めて i = 1
2回目 i=5
括弧を使用するとカンマ演算子が最後の値を取得し、括弧がないと最初の値を取得するのはなぜですか?
前もって感謝します。
最初のものは(i = 1),2,3,4,5;
、カンマが無効であることを意味します。括弧で使用すると、「カンマ区切りリスト」の最後の値が返されます
これはすべて演算子の優先順位によるもので、ここで表を表示できます
これは、演算子の優先順位と評価の順序によるものです。=
以下の 2 つの式が同じであることがわかり,
ます。
i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)
補足:コンマ演算子は、それらすべての中で「最も弱い」演算子です。
コンマ演算子がリストの最後の値を生成するのはなぜですか?
簡単に言うと、この演算子は最初のオペランドのみを評価して破棄し、次のオペランドに移動します。左から右にバインドします。つまり、左から開始し、右に向かって歩き続けます。
このトピックに関する詳細はどこで確認できますか?
割り当てはコンマよりも優先されるため、最初のケースで得られる結果です。演算子の優先順位表全体は、こちらで確認できます。
括弧を使用するとコンマ演算子が最後の値を取得し、括弧がないと最初の値を取得するのはなぜですか?
括弧は優先順位をオーバーライドするために使用されるためです。最初のケースは暗黙のうちに と等価です:
(i = 1),2,3,4,5;
カンマは左から右に評価され、一番右の値が式全体の値になります。こちらのドキュメントをお読みください。
コンマ演算子には、左から右への結合性があります。コンマで区切られた 2 つの式は、左から右に評価されます。左のオペランドは常に評価され、右のオペランドが評価される前にすべての副作用が完了します。
=
は (最も低い)よりも優先順位が高いため,
、最初のものと同じです。
(i = 1),2,3,4,5;
これは( )に代入1
し、コンマ演算子を介して式、、、およびを評価します (式全体は実際には使用されない になります)。2番目のものでは、i
i = 1
2
3
4
5
5
(1,2,3,4,5)
は括弧で囲まれているため、 の前に最初に評価され=
ます。その結果、5
(一番右の式。これはコンマ演算子の動作です) に割り当てられi
ます。
i = (1,2,3,4,5);
| |
\---------\--- results in 5 then is assigned to i
演算子の優先順位に関するウィキペディアの記事を参照してください。