5

&&の優先順位が||の優先順位よりも大きい場合、このコードは最初に--b && ++ cを評価するべきではないため、出力は1 2 4 11になります。しかし、ここでは1を与えるために短絡しているようです。 2 5 10.助けてください!

int x;
int a=1,b=5,c=10;
x=a++||--b&&++c;
printf("%d %d %d %d\n",x,a,b,c);
return 0;
4

5 に答える 5

14

このコードは最初に--b&&++cを評価するべきではありません

演算子の優先順位は、評価の順序に影響しませんそれはただそれを意味します

a++||--b&&++c

と同等です

a++||(--b&&++c)

したがって、それa++が最初に評価され、ステートメントを短絡させます。

于 2012-05-23T17:30:12.210 に答える
2

の優先順位&&は高くなります。つまり、。よりも左右の物にしっかりと結合し||ます。その式はと同等です

a++ || (--b && ++c)

||左側の式が0以外と評価された場合にのみ、右側のものを評価します。aはであるため、評価される1だけで、デクリメントもインクリメントもされません。a++bc

于 2012-05-23T17:30:43.280 に答える
2

はい、優先順位は高くなりますが、これはオペランドのグループ化&&のみを決定し、評価の順序は決定しません。ここでの基本操作はです。これは、右側の操作に関係なく、左側が真の場合に右側が評価されないことを保証します。||

于 2012-05-23T17:36:31.927 に答える
1

ここで機能している2つの概念があります

  1. 演算子の結合性
  2. コンパイラの最適化短絡

Cでは|| 演算子は結合性のままです。その結果、a++が最初に評価されます。左側がTRUEなので、コンパイラの最適化短絡すると、||の右側が確実になります。式の結果は変更されないため、評価されません。

于 2012-05-23T21:08:38.367 に答える
0

遅延評価

--b && ++cまったく評価されていません。

于 2012-05-23T17:32:22.650 に答える