19

基本的に次のことを行うコードに出くわしました。

int a = (1, 2, 3);

この表記は見たことがありません。どういう意味ですか?

4

6 に答える 6

37

これはコンマ演算子です:a, b最初に のa評価 が評価され、次に が評価され、b結果は の結果になりbます。

int a = (1, 2, 3);最初に を評価し1、次に2を最終的に評価し、3その最後を使用し3て初期化しますa。ここでは役に立ちませんが、 の左オペランドに,副作用がある場合 (通常は関数呼び出しの場合) に役立ちます。

于 2013-05-15T11:00:21.597 に答える
7

Wiki:コンマ演算子

i = (a, b, c);          // stores c into i
于 2013-05-15T10:59:47.030 に答える
5

コンマ演算子です。C11 標準は、この種の演算子の 1 つの使用例について説明しています。

C11標準6:5:17

コンマ演算子

コンマ演算子の左側のオペランドは void 式として評価されます。その評価と右オペランドの評価の間にはシーケンス ポイントがあります。次に、右側のオペランドが評価されます。結果には型と値があります.114)

コンマ演算子 (この節で説明されているように) は、リスト内の項目を区切るためにコンマが使用されているコンテキスト (関数への引数や初期化子のリストなど) では使用できません。一方、括弧で囲まれた式内、またはそのようなコンテキストの条件演算子の 2 番目の式内で使用できます。関数呼び出し f(a, (t=3, t+2), c) では、関数には 3 つの引数があり、2 番目の引数の値は 5 です。

于 2013-05-15T11:12:58.930 に答える
3

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++でも同じように機能します

于 2013-05-15T11:04:46.990 に答える
3

これはコンマ演算子です。複数の式を「ラップ」し、それらを左から右に評価し、式全体の値が最後のサブ式によって決定されます。あなたの例では、それはに評価され3ます。

コンマ演算子が特に便利な状況は、たとえば2 つの変数をインクリメントするなど、for ループの「インクリメント」式で複数の処理を実行する場合です。

x例:とyを別々の変数として使用して、対角線に沿って画像を反復します。と に 2 つの別々の変数を使用しますxyこれは、ループ内で一方を他方から独立して変更したい場合があるためです (覚えておいてください、これはばかげた例にすぎません)。したがって、 for ループの「インクリメント」ステートメントで と のx両方をインクリメントしたい:y

for(int x = 0, y = 0; x < width && y < height; ++x, ++y) {
    // ...                                     ^^^^^^^^
}

for ループの「初期化」式ではコンマ演算子を使用しないことに注意してください。2 つの変数を宣言するだけです。

于 2013-05-15T11:14:54.423 に答える