4

gccコンパイラの次の基本コードは3を出力します。

しかし、それを置き換えると、4が出力{}されます。()

     int i={3,2,4};printf("%d",i); 

誰かがこの行動を説明できますか?演算子は左から右への,評価に従いますが、の場合はそうではありません{}

4

1 に答える 1

22

{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に起因するようになります。

于 2012-11-14T10:25:29.937 に答える