2

次のコードを実行しようとしていて、いくつかの結果に出くわしました。誰か説明してください:

int number = {12,13,14};
printf("%d",number);

上記のコードは、出力を として出力し12ます。次のコードを実行しようとすると:

int number = (12,13,14);
printf("%d",number);

これは出力を として出力し14ますが、次のコードでは出力を として出力します12:

int number;
number = 12,13;
printf("%d",number);
4

3 に答える 3

4

number = {12,13,14}スカラー初期化ですが、必要以上の要素を提供しています。コンパイラは警告をスローしますが、これは無視され、最初の要素 12 が variable に割り当てられていると思いますnumber

ご利用の際はnumber = (12,13,14)

コンマ ( ,) 演算子は、最初のオペランドを評価して結果を破棄し、次に 2 番目のオペランドを評価して結果を返します。

したがって、ここでは 12 が破棄され、13 が 13 と評価されて返されます。この返された 13 の値は、次のコンマ演算子の最初のオペランドです。ここで、13 から 13 を評価し、この結果 13 を破棄して、2 番目のオペランド、つまり 14 を評価し、結果を variable に割り当てられた 14 として返しますnumber

あなたが次のことをするとき

  number = 12,13;
  printf("%d",number);

これは 12 を出力します。これは、優先順位が 12=より大きい,ため、最初number = 12に評価され、=割り当てられた値、つまり 12 が返されます。ここで、コンマ演算子は、演算の戻り値、つまり 12 と 13 の 2 つのオペランドを取得しまし=た。コンマ演算子を使用すると、12 は 12 として評価され、破棄されます。13 が評価されて返されます。に戻った?誰でもない。number割り当てが既に実行されているため、割り当てられていません。ようnumber = 12,13;に見える(number=12),13;

これも試してみてください。

   int num1,num2;
   num2 = (num1 = 13,14);
   printf("%d %d",num1,num2);

これは13 14、以前のコード出力に指定された引数に従って出力されます。

于 2013-10-01T01:30:43.363 に答える
1
int number = {12,13,14};

numberでありint、このような初期化子を想定していないため、違法な C 構文です。

int number = (12,13,14);

コンマ演算子は結果として右側のオペランドを返します。これは と同等int number = ((12,13),14)であるためnumber、値は14です。

int number = 12,13;

これは代入ではなく初期化です。したがって、ここではカンマ演算子を使用しないでください。C 構文が正しくありません。

編集後、このコード

int number;
number = 12,13;

式ステートメントであり、コンマ演算子であり、最初のオペランドは副作用として代入する代入であり、2 番目のオペランドnumber = 12number式ステートメントであり、副作用がないため何もしません。1213

于 2013-10-01T01:43:47.660 に答える
0

最初の式:

int number = {12,13,14};

ドラフトC99標準セクションの初期化パラグラフ2を見ると、未定義の動作です。6.7.8

イニシャライザは、初期化されるエンティティに含まれていないオブジェクトに値を提供しようとしません。

この場合、初期化子は 2 つの要素を超えています。2 番目のケースは、セクションパラグラフ2で説明されているコンマ演算子に依存しています(強調鉱山):6.5.17

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

2番目のケース:

int number = (12,13,14);

次と同等です。

int number = ((12,13),14);

6.5.17The result of (12,13)will be13および the result of 13,14will beに記載されている規則に従います14。最後のケースでは:

number = 12,13;

バインドは、値が割り当てられるよりも=タイト (優先順位が高い) であるため、副作用なしで評価されます。,12number13

于 2013-10-01T04:00:08.767 に答える