gccコンパイラの次の基本コードは3を出力します。
しかし、それを置き換えると、4が出力{}
されます。()
int i={3,2,4};printf("%d",i);
誰かがこの行動を説明できますか?演算子は左から右への,
評価に従いますが、の場合はそうではありません{}
。
gccコンパイラの次の基本コードは3を出力します。
しかし、それを置き換えると、4が出力{}
されます。()
int i={3,2,4};printf("%d",i);
誰かがこの行動を説明できますか?演算子は左から右への,
評価に従いますが、の場合はそうではありません{}
。
{3,2,4}を使用する場合、スカラー初期化を使用していますが、必要以上の要素を提供しています。これにより、コンパイラによる警告がトリガーされますが、コンパイルと実行の両方が行われ、スカラー初期化の最初の要素は変数iに帰属します。
(3,2,4)を使用する場合、基本的にコンマ演算子を使用しています(変数を初期化するため、括弧が必要です)。コンマ演算子は、最初のオペランドを評価して結果を破棄し、次に2番目のオペランドを評価して結果を返します。したがって、ここでは3を評価し、それを破棄してから2を評価し、それを返し(この戻り値は2番目のコンマの左オペランドとして使用されます)、最後に4を評価して返します。したがって、4は変数iに起因します。
もう1つの興味深い操作は次のとおりです。
int i;
i = 3,4;
printf("%d\n",i);
これは3を出力します。これは、最初のi = 3が評価され(これはコンマの左オペランドであるため)、その結果は破棄されるためです。次に、4が評価され、その結果が返されますが、変数に起因するものではありません。
そして、物事をより面白くするために:
int i,j;
j = (i = 3,4);
printf("%d %d\n",i,j);
これにより、「34」が出力されます。つまり、上記で説明したことはすべて発生しますが、4が評価されて返されると、jに起因するようになります。