12

このコードが常に生成するのはなぜx=2ですか?

unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
4

10 に答える 10

30

1番目x++はxを1に変更して0を返します
2番目x++はxを2に変更して1を返します

その時点で、またはは短絡し、trueを返し、xを2のままにします。

于 2010-01-14T19:45:27.070 に答える
11

x ++ || x ++ || x ++ || x ++ || ........;

  • 最初のx++は、条件付きチェックのために最初に0と評価され、その後に増分が続きます。したがって、最初の条件は失敗しますが、xは1にインクリメントされます。
  • ここで、2番目のx ++が評価されます。これは条件付きチェックで1に評価され、xは2にインクリメントされます。式は1(true)に評価されるため、これ以上先に進む必要はありません。
于 2010-01-14T19:45:55.307 に答える
9

ブール式の評価での短絡と、CおよびC++のシーケンスポイント||のためです。

于 2010-01-14T19:44:58.430 に答える
5

||短絡。左から評価すると、真の値(ゼロ以外)が見つかると、式が真になり、二度と偽になることはないため、評価が停止します。

最初x++に0と評価され(インクリメント後なので)、次に1と評価されます。これは真であり、これで完了です。

于 2010-01-14T19:45:31.970 に答える
2

"a || b || c || d || e || ..." を評価しているとき、見つけた最初のゼロ以外の値で評価を停止できます。

最初の "x++" は 0 に評価され、x が 1 にインクリメントされ、式の評価が続行されます。2 番目の x++ は 1 に評価され、x を 2 にインクリメントします。その時点で、OR ステートメントの残りの部分を見て、それが true になることを知る必要がないので、停止します。

于 2010-01-14T19:46:50.640 に答える
1

論理 OR は、真が見つかったときに短絡するためです。

したがって、最初の x++ はポストインクリメントであるため、0 (false) を返します。(x = 1) 2 番目の x++ は 1 (true) を返します - 短絡。(x = 2)

プリント x = 2;

于 2010-01-14T19:46:47.643 に答える
1

比較対象の評価が早いため。

これは

 0++ | 1++

コンパイラは x==1 になるとすぐに比較を終了し、インクリメントを送信して x==2 にします。

于 2010-01-14T19:46:50.547 に答える
1

最初の "x++ || x++" は "true" と評価されるため ("0 || 1" が true であるため、0 以外であることを意味します。これらはすべて論理 OR 演算子であるため、残りの OR 演算は無視されます。

マイク

于 2010-01-14T19:47:38.907 に答える
1

演算子は左側の||式を評価し、0 (false) の場合は右側の式を評価します。左辺が 0 でない場合、右辺はまったく評価されません。

x++ || x++ || x++ || ...では、最初のx++ものが評価されます。これは 0 に評価され、x は 1 にインクリメントされます。2 番目x++が評価されます。it は 1 に評価され、x は 2 にインクリメントされます。2 番目の式はx++ゼロ以外の値に評価されるため、残りのx++式は評価されません。

于 2010-01-14T19:48:28.810 に答える
0

に置き換え||てみて|ください.--

論理演算子の短絡です。

あなたがするときも同じ理由です

if (returns_true() || returns_true()){ }

returns_true一度だけ呼び出されます。

于 2010-01-14T19:45:55.523 に答える