私はかなり長い間Cプログラミングに携わってきました。数日前、私は間違って書かれたコードに出くわし、次の質問にたどり着きました。
次の C コードは何を出力するでしょうか。
if (0,2)
printf("red");
私はかなり長い間Cプログラミングに携わってきました。数日前、私は間違って書かれたコードに出くわし、次の質問にたどり着きました。
次の C コードは何を出力するでしょうか。
if (0,2)
printf("red");
コードの出力は次のようになります。
red
if
ステートメントの条件は、2 番目のオペランドの結果 (この場合は 2 ) に評価されるコンマoperatorを使用します。C の非ゼロは true に類似しているため、式はtrueであり、実行されます。printf
コンマ演算子を使用すると、最初のオペランドが評価され、結果が破棄されます。次に、2 番目のオペランドが評価され、式の結果と型は、この 2 番目のオペランドの評価の結果と型になります。コンマ演算子の詳細については、wikipedia を参照してください。
あなたが与えた文脈では、カンマ演算子は役に立ちません。
if (0,2)
printf("red");
この場合、次のように言います。
Do nothing with 0
if (2) //which is true
print "red"
最後の値の前の opp(s) に意味を持たせたい場合を除き、基本的には何もしません。これが必要な理由のもう少し役立つ例:
int i, j;
int arr[4] = {1,2,3,4};
for(i=0, j=1; i<4; j+=2, i+=2){
printf("arr[%d] = %d\n", i, arr[i]);
printf("arr[%d] = %d\n", j, arr[j]);
}
このループを 2 回繰り返すだけで、配列内の 4 つの値すべてが出力されます。
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
そこに2つ以上の操作がある場合も同じように機能するため、必要に応じて次のことができます。
if(a++, b++, 1)
printf("red");
これで、「赤」を印刷しているときに a と b がインクリメントされます
if
ステートメントでは、制御式がゼロ以外の場合にステートメントが実行されます。
0, 2
はコンマ式であり2
、ゼロ以外の右側のオペランドに評価されます。
if
したがって、式のステートメントは次のとおりです。
printf("red");
あなたの例で実行されます。
タイトルの質問に答えるには ( C 2011 オンライン ドラフトから):
6.5 式
1式は、値の計算を指定するか、オブジェクトまたは関数を指定するか、副作用を生成するか、またはそれらの組み合わせを実行する一連の演算子とオペランドです。演算子のオペランドの値の計算は、演算子の結果の値の計算の前に並べられます。
スニペットで
if (0,2)
printf("red");
0,2
コンマ式です。各部分式0
と2
は左から右に評価され、カンマ式の値は一番右の部分式 (この場合は2
) の値です。の結果0,2
が非ゼロであるため、分岐が行われ、printf
ステートメントが実行されます。
コンマ演算子は、関数内で引数を区切るために使用されるコンマとは異なることに注意してください。
foo(a, b, c);
この場合、a, b, c
はコンマ式ではなくパラメータ リストです。評価の特定の順序はなく (またはのc
前に評価される場合があります)、結果の値はありません。 a
b
コンマ演算子は最初のオペランドを評価して結果を破棄し、次に2番目のオペランドを評価して結果を返すため、red
どちらが値であるかを返し、IFブロックに入ります。2
TRUE