O/p は、演算子の優先順位と一致しない x=2,y=1,z=1 になります。これをTurbo C ++コンパイラで実行していました:
void main()
{
int x,y,z,q;
x=y=z=1;
q=++x || ++y && ++z;
printf("x=%d y=%d z=%d",x,y,z);
}
O/p は、演算子の優先順位と一致しない x=2,y=1,z=1 になります。これをTurbo C ++コンパイラで実行していました:
void main()
{
int x,y,z,q;
x=y=z=1;
q=++x || ++y && ++z;
printf("x=%d y=%d z=%d",x,y,z);
}
実際、結果は標準 C に完全に準拠しています。論理 or 演算子 ( )は、ゼロ以外の数値に評価されるため||
後で短絡し、残りは無視されます。++x
x=1
, y=1
,で始まりz=1
、短絡の後x=2
、y=1
, . が得られますz=1
。
x=y=z=1;
すべての変数を = 1 にします
q=++x || ++y && ++z;
はそれ++x
を = 2 にし、ゼロではないので、最初の条件が であるため、他の条件のチェックを停止しますtrue
。
したがって、x=2
、およびy and z = 1
演算子の優先順位は、演算子が実行される順序を決定するものではありません。演算子の優先順位は、演算子とそのオペランドの間のグループ化のみを定義します。あなたの場合、演算子の優先順位は、式が
q = ++x || ++y && ++z
としてグループ化されます
q = ((++x) || ((++y) && (++z)))
残りは、演算子の優先順位とはまったく関係ありません。
残りは、特定の各演算子のセマンティクスによって決まります。この場合の最上位の演算子は||
. 演算子の特定のプロパティは||
、常に左側を最初に評価することです。また、左辺のサイズがゼロでないことが判明した場合、右辺の評価さえ試みません。
これはまさにあなたの場合に起こることです。左辺は++x
であり、ゼロ以外の値に評価されます。これは、指定された初期値を持つ式全体が機能的に単なるものと同等であることを意味します
q = (++x != 0)
||
オペレーターの右側は触れていません。
論理&&
(AND
)および||
(OR
)演算子は、短絡の対象となります。
「論理演算子は、左から右へのオペランドの評価を保証します。ただし、式の結果を決定するために必要な最小数のオペランドを評価します。これは「短絡」評価と呼ばれます。」
したがって、論理演算子の場合、常に(||
または&&
)左から右として評価されます。そして前述のように、ここでの優先順位は誰が誰を取るかを決定するだけです。次に、左から右へのルール。
q = ++x || ++y && ++z;
//ok, lets play by rule, lets see who takes who:
//first pass ++ is badass here (has highest precedence)
//q = (++x) || (++y) && (++z)
//second pass &&'s turn
//q = (++x) || ((++y) && (++z))
//done, let's do left to right evaluation
q = (++x) || rest..
q = (true)|| whatever..
それがより明確になることを願っています。