#include "stdio.h"
int main()
{
int a=3,b=4,c=5;
printf("%d %d %d\n",(a,b,c));
}
結果は次のとおりです。
5 2280760 2281472
誰がこれを説明できますか?
#include "stdio.h"
int main()
{
int a=3,b=4,c=5;
printf("%d %d %d\n",(a,b,c));
}
結果は次のとおりです。
5 2280760 2281472
誰がこれを説明できますか?
未定義の動作が発生しました:
この -(a,b,c)
は最後のパラメーターとして評価されます。たとえばc
、最初に表示される数字は 5 ( c = 5
) で、残りの 2 つは初期化されていないパラメーターです。
うまくいきません。未定義の動作が発生します。
に 3 つの書式指定子を指定しprintf
、可変引数を 1 つだけ指定しました。これは、C(a,b,c)
では の値に評価される式であるためです(カンマ演算子c
について読んでください) 。
引数の数がフォーマット指定子の数と一致しないため、動作は未定義です。
printf
呼び出しには 2 つの引数しかありません:"%d %d %d"
と評価の結果です(a,b,c)
。
の結果は(a,b,c)
、リストの最後の項目 :c
です。これは 5 です。これが printf に渡され5
、最初の %d が表示されます。
これ以上引数がないため、残りの %d はコール スタックに残っているガベージを表示するだけで、奇妙な値が表示されます。
コンマ式について見逃していると思います。コンマ式には、コンマで区切られた任意の型の 2 つのオペランドが含まれており、左から右への結合があります。左のオペランドは完全に評価され、副作用が発生する可能性があり、その値が存在する場合は破棄されます。次に、右側のオペランドが評価されます。コンマ式の結果の型と値は、通常の単項変換後の右側のオペランドのものです。
コンマ式の結果は左辺値ではありません。
したがって、上記の結果が得られます
IBMがドキュメントで述べているように:
コンマ演算子の主な用途は、次の状況で副作用を生成することです。
- 関数の呼び出し
- 反復ループに入るまたは繰り返す
- 条件のテスト
- 副作用が必要であるが、式の結果がすぐに必要とされないその他の状況
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
。