2
#include "stdio.h"
int main()
{
    int a=3,b=4,c=5;
    printf("%d %d %d\n",(a,b,c));
}

結果は次のとおりです。

5 2280760 2281472

誰がこれを説明できますか?

4

5 に答える 5

7

未定義の動作が発生しました:

この -(a,b,c)は最後のパラメーターとして評価されます。たとえばc、最初に表示される数字は 5 ( c = 5) で、残りの 2 つは初期化されていないパラメーターです。

于 2012-08-19T07:59:14.267 に答える
4

うまくいきません。未定義の動作が発生します。

に 3 つの書式指定子を指定しprintf、可変引数を 1 つだけ指定しました。これは、C(a,b,c)では の値に評価される式であるためです(カンマ演算子cについて読んでください) 。

引数の数がフォーマット指定子の数と一致しないため、動作は未定義です。

于 2012-08-19T07:58:53.253 に答える
2

printf呼び出しには 2 つの引数しかありません:"%d %d %d"と評価の結果です(a,b,c)

の結果は(a,b,c)、リストの最後の項目 :cです。これは 5 です。これが printf に渡され5、最初の %d が表示されます。

これ以上引数がないため、残りの %d はコール スタックに残っているガベージを表示するだけで、奇妙な値が表示されます。

于 2012-08-19T08:01:46.950 に答える
0

コンマ式について見逃していると思います。コンマ式には、コンマで区切られた任意の型の 2 つのオペランドが含まれており、左から右への結合があります。左のオペランドは完全に評価され、副作用が発生する可能性があり、その値が存在する場合は破棄されます。次に、右側のオペランドが評価されます。コンマ式の結果の型と値は、通常の単項変換後の右側のオペランドのものです。

コンマ式の結果は左辺値ではありません。

したがって、上記の結果が得られます

IBMがドキュメントで述べているように:

コンマ演算子の主な用途は、次の状況で副作用を生成することです。

  1. 関数の呼び出し
  2. 反復ループに入るまたは繰り返す
  3. 条件のテスト
  4. 副作用が必要であるが、式の結果がすぐに必要とされないその他の状況
于 2012-08-19T08:06:22.643 に答える
0

MByD 氏は次のように述べています。

この - (a,b,c) は c などの最後のパラメーターとして評価されるため、最初に出力される数値は 5 (c = 5) で、他の 2 つは初期化されていないパラメーターです。

ただし、 a と b は初期化されていません。(以下のコードを試してください)

int a=3,b=4,c=5;
printf("%d %d %d\n",a,(a,b,c),b);

ブラケットのため、1 つのパラメーターと見なされます。また、左から右への解析により(ユーザーの null ポインターが言ったように)、c がその値であることがわかりました。

上記のコード出力3 5 4

于 2015-10-10T03:20:53.697 に答える