3

コンマ演算子は左から右に作用するのに、なぜ はint a[x,y]に変換されるのですか? 内部操作が最初に終了するため、a[y]期待できます。a[(x,y)]しかし、最初のものでは、最初の引数を取ることになっています。

配列の初期化にコンマ演算子を使用する予定はありません。なぜこれが起こるのかを尋ねるだけです。

私は本でそれを読んで、私は混乱しています。

アップデート:

ウィキペディアは次のように述べています。

 i = a, b, c;            // stores a into i 
 i = (a, b, c);          // stores c into i   

したがって、コードの最初の行が配列で述べているように、最初の値を配列に割り当てる必要があります。注:実際にこれを使用する予定はありません。私はちょうど尋ねています。私は C++ を学んでいて、配列宣言 a[y,x]; の本を読みました。したがって、a[y]、x; である必要があります。[x]ではありません。なぜコンパイラはこれを行うのですか?

4

2 に答える 2

9

コンマ演算子,は、「忘れる」演算子とも呼ばれます。次のことを行います。

  1. 左オペランドを完全に評価する
  2. その価値を忘れる
  3. 正しいオペランドを完全に評価する
  4. 右オペランドの値を演算子式全体の値として使用します。

したがって、あなたの場合は、正常に動作します。a[x, y]最初にを評価しx、次にその値を破棄し、次にの値をy式全体(括弧内の値)の値として使用します。

編集

ウィキペディアでの編集について。,の優先順位は。の優先順位よりも小さいことに注意してください=。言い換えると、

i = a, b, c;

として解釈されます

(i = a), b, c;

そのため、aにコピーされiます。ただし、式全体の結果は引き続きですc

于 2013-01-17T13:06:51.587 に答える
0

コンパイラは、括弧を追加するつもりであると想定していると思います。C++ には、コンマ演算子とコンマ区切りがあります。コンマ演算子自体とそのオペランドを括弧で囲む必要があります。int 配列コンストラクターは 1 つの値しか想定していないため、コンパイラーがあなたを助けようとしていると推測しています。

http://msdn.microsoft.com/en-us/library/zs06xbxh(v=vs.80).aspx

編集: int a[x,y] は無効です。int a[(x,y)] は有効です。彼のコンパイラは、彼が括弧を追加するつもりであると想定しています。より一般的なコンテキストでは、カンマ演算子に括弧は必要ありません。関数呼び出しと初期化子では、コンマ演算子とコンマ区切りの使用を区別するために括弧が必要です。

于 2013-01-17T13:13:50.527 に答える