このコードが常に生成するのはなぜx=2
ですか?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
このコードが常に生成するのはなぜx=2
ですか?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
1番目x++
はxを1に変更して0を返します
2番目x++
はxを2に変更して1を返します
その時点で、またはは短絡し、trueを返し、xを2のままにします。
x ++ || x ++ || x ++ || x ++ || ........;
||
短絡。左から評価すると、真の値(ゼロ以外)が見つかると、式が真になり、二度と偽になることはないため、評価が停止します。
最初x++
に0と評価され(インクリメント後なので)、次に1と評価されます。これは真であり、これで完了です。
"a || b || c || d || e || ..." を評価しているとき、見つけた最初のゼロ以外の値で評価を停止できます。
最初の "x++" は 0 に評価され、x が 1 にインクリメントされ、式の評価が続行されます。2 番目の x++ は 1 に評価され、x を 2 にインクリメントします。その時点で、OR ステートメントの残りの部分を見て、それが true になることを知る必要がないので、停止します。
論理 OR は、真が見つかったときに短絡するためです。
したがって、最初の x++ はポストインクリメントであるため、0 (false) を返します。(x = 1) 2 番目の x++ は 1 (true) を返します - 短絡。(x = 2)
プリント x = 2;
比較対象の評価が早いため。
これは
0++ | 1++
コンパイラは x==1 になるとすぐに比較を終了し、インクリメントを送信して x==2 にします。
最初の "x++ || x++" は "true" と評価されるため ("0 || 1" が true であるため、0 以外であることを意味します。これらはすべて論理 OR 演算子であるため、残りの OR 演算は無視されます。
マイク
演算子は左側の||
式を評価し、0 (false) の場合は右側の式を評価します。左辺が 0 でない場合、右辺はまったく評価されません。
式x++ || x++ || x++ || ...
では、最初のx++
ものが評価されます。これは 0 に評価され、x は 1 にインクリメントされます。2 番目x++
が評価されます。it は 1 に評価され、x は 2 にインクリメントされます。2 番目の式はx++
ゼロ以外の値に評価されるため、残りのx++
式は評価されません。
に置き換え||
てみて|
ください.--
論理演算子の短絡です。
あなたがするときも同じ理由です
if (returns_true() || returns_true()){ }
returns_true
一度だけ呼び出されます。