基本的に次のことを行うコードに出くわしました。
int a = (1, 2, 3);
この表記は見たことがありません。どういう意味ですか?
これはコンマ演算子です:a, b
最初に のa
評価 が評価され、次に が評価され、b
結果は の結果になりb
ます。
int a = (1, 2, 3);
最初に を評価し1
、次に2
を最終的に評価し、3
その最後を使用し3
て初期化しますa
。ここでは役に立ちませんが、 の左オペランドに,
副作用がある場合 (通常は関数呼び出しの場合) に役立ちます。
Wiki:コンマ演算子
i = (a, b, c); // stores c into i
コンマ演算子です。C11 標準は、この種の演算子の 1 つの使用例について説明しています。
C11標準6:5:17
コンマ演算子
コンマ演算子の左側のオペランドは void 式として評価されます。その評価と右オペランドの評価の間にはシーケンス ポイントがあります。次に、右側のオペランドが評価されます。結果には型と値があります.114)
コンマ演算子 (この節で説明されているように) は、リスト内の項目を区切るためにコンマが使用されているコンテキスト (関数への引数や初期化子のリストなど) では使用できません。一方、括弧で囲まれた式内、またはそのようなコンテキストの条件演算子の 2 番目の式内で使用できます。関数呼び出し f(a, (t=3, t+2), c) では、関数には 3 つの引数があり、2 番目の引数の値は 5 です。
1、2、および 3 を評価するだけで (これらは単なる値ですが、関数呼び出しでもかまいません)、最後の値 (または戻り値) を左側のオペランド (例では a) に設定します。
たぶん、これはそれがどのように機能するかを理解するのに役立ちます:
#include <stdio.h>
int toto()
{
printf("toto()\n");
return (21);
}
int tata()
{
printf("tata()\n");
return (42);
}
int main()
{
int a = (toto(), tata());
printf("%d\n", a);
return (0);
}
出力:
toto()
tata()
42
編集:これはCコードで、C++でも同じように機能します
これはコンマ演算子です。複数の式を「ラップ」し、それらを左から右に評価し、式全体の値が最後のサブ式によって決定されます。あなたの例では、それはに評価され3
ます。
コンマ演算子が特に便利な状況は、たとえば2 つの変数をインクリメントするなど、for ループの「インクリメント」式で複数の処理を実行する場合です。
x
例:とy
を別々の変数として使用して、対角線に沿って画像を反復します。と に 2 つの別々の変数を使用しますx
。y
これは、ループ内で一方を他方から独立して変更したい場合があるためです (覚えておいてください、これはばかげた例にすぎません)。したがって、 for ループの「インクリメント」ステートメントで と のx
両方をインクリメントしたい:y
for(int x = 0, y = 0; x < width && y < height; ++x, ++y) {
// ... ^^^^^^^^
}
for ループの「初期化」式ではコンマ演算子を使用しないことに注意してください。2 つの変数を宣言するだけです。