質問があります。コンパイラが次のコードでどのように動作するかです。
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
私は結果がある理由はわかりませんd = 11
。
質問があります。コンパイラが次のコードでどのように動作するかです。
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
私は結果がある理由はわかりませんd = 11
。
回答:
でint d = (b == c++) ? (c+1) : (c-1);
:
c++
は、現在の値c
11です。これとc
は別に、12に増分されます。b == 11
はb
12 なのでfalse です。(b == c++)
は偽なので、(c-1)
使用されます。また、c
この時点で12までの増分を完了する必要があります。c
12は、c-1
11です。d
その値に初期化されます、11。C標準に準拠(6.5.15条件演算子)
4最初のオペランドが評価されます。その評価と2番目または3番目のオペランド(評価される方)の評価の間にシーケンスポイントがあります。2番目のオペランドは、最初のオペランドが0と等しくない場合にのみ評価されます。3番目のオペランドは、最初のオペランドが0と等しい場合にのみ評価されます。結果は、2番目または3番目のオペランド(評価された方)の値であり、以下に説明する型に変換されます。110)
したがって、この宣言の初期化式では
int d = (b == c++) ? (c+1) : (c-1);
変数は、b
変数の値と比較されるc
ポストインクリメントオペレータがそれをインクリメントする前に、そのオペランドの値を返すため。
値が互いに等しくない(b
12にc
設定され、11に設定されている)ため、部分式(c-1)
が評価されます。
引用によると、オペレーターの状態の評価後にシーケンスポイントがあります。これは、状態の評価後c
に値が12
変数にポストインクリメント演算子を適用した後c
。その結果、変数dは値1
(12 - 1
)によって初期化されます。
?:
。通常Cでは++
、同じオペランドの他の演算と組み合わせることは未定義の動作であるためです。また、に?:
はさまざまな特別なスノーフレークルールがあるため、このコードは予測どおりにしか機能しません。
条件が偽のBeacuse、したがって、false
ケースの処理が行われます。c-1
しかし、あなたはインクリメント以降c
での状態でc++
、そのためc
今あります12
。したがって、結果は11である12-1です。
編集:OPがポストインクリメントと誤解したのは、
だから実際に起こることはこのようなものです:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d;
if (b == c) { // 12 == 11 ? -> false
c = c + 1;
d = c + 1;
} else { // this executes since condition is false
c = c + 1; // post increment -> c++ -> c = 12 now
d = c - 1; // 12 - 1 = 11 -> d = 11
}
printf("d = %i\n", d);
}
c++
、条件で与えられた操作の順序を参照していると思います。条件が偽であるが、その後orginalの値をc
計算するために使用されているc - 1
、いないインクリメントバージョン。
c++
と++c
c++
はポストインクリメント演算子です。の値c++
は11で、の副作用がありc == 12
ます。++c
12の値がなければなりません
構文
状態 ?value_if_true:value_if_false
だから、あなたは書いた
int d = (b == c++) ? (c+1) : (c-1);
この状況では、ifチェックの後で 'c'値が増加し(c + 1 = 12)、その後 'd'値がc(12)-1として11に設定されるため、結果は11になります。
あなたが使用した場合、例えば:
int d = (b == ++c) ? (c+1) : (c-1);
「c」の値はステートメントをチェックする前に増加するため、trueとなり、「d」の値はc(12)+1、つまり13になります。