私は評価の順序がどうなるかについてたくさんの研究をしました-しかし、それがこの方程式のためにどうなるかを理解することはできません:
z = !x + y * z / 4 % 2 - 1
私の最善の推測は(左から右へ):
z = !x + {[([y * z] / 4) % 2] - 1}
私は評価の順序がどうなるかについてたくさんの研究をしました-しかし、それがこの方程式のためにどうなるかを理解することはできません:
z = !x + y * z / 4 % 2 - 1
私の最善の推測は(左から右へ):
z = !x + {[([y * z] / 4) % 2] - 1}
評価の順序と演算子の優先順位は 2 つの異なるものです。
あなたの最善の推測は正しいです。すべての乗法演算子*
/
%
の優先順位は同じで、左から右にバインドされます。加算演算子の-
優先順位は低くなります。単項!
演算子は、乗法演算子または加法演算子よりも厳密に結合します。また、代入演算子の=
優先順位は非常に低いです (ただし、コンマ演算子よりはまだ高い)。
したがって、この:
z = !x + y * z / 4 % 2 - 1
これと同等です:
z = (!x) + (((y * z) / 4) % 2) - 1
ただし、オペランドは任意の順序で正当に評価できます (左から右への評価を課す 、 、&&
など||
の特定の演算子を除く)。,
オペランドが単純な変数である場合、これはおそらく問題ではありませんが、次のようなものです。
z = func(x) * func(y);
2 つの関数呼び出しは、どちらの順序で発生してもかまいません。
理解できないなら表現を書き直せ
z = !x + y * z / 4 % 2 - 1
notx = !x; /* you can move this line 1, 2, or 3 lines down */
tmp1 = y * z;
tmp2 = tmp1 / 4;
tmp3 = tmp2 % 2;
tmp4 = notx + tmp3;
tmp5 = tmp4 - 1;