質問は:
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
出力と、「y」の負の値に対して--yがどのように機能するかを知りたかっただけです。これを解決するための優先順位は何ですか?
質問は:
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
出力と、「y」の負の値に対して--yがどのように機能するかを知りたかっただけです。これを解決するための優先順位は何ですか?
演算子の優先順位または「操作の順序」に基づいて評価されます - http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
z = 5++ - --(-10) * 2 / 4 // Suffix ++/-- goes first
z = 5 - --(-10) * 2 / 4 // Prefix ++/-- is next
z = 5 - (-11) * 2 / 4 // and then * and /
z = 5 - (-22) / 4
z = 5 - (-5)
z = 10
y とは異なり、x はその値を保持します。サフィックス表記では、演算子は変更された値ではなく元の値を返すためです。(他の誰かが演算子の優先ページにリンクしているので、リンクしません)
操作の優先順位は
z = ((x++) - (((--y) * b) / a));
ああ、
--y
計算する前に知っておく必要があります--y * b
。--y * b
計算する前に知っておく必要があります--y * b / a
(*
と/
の優先順位は同じですが、左結合であるため、a / b * c
として解析されます(a / b) * c
)。x++
計算する前に知っておく必要がありますx++ - --y * b / a
x++ - --y * b / a
に代入する前に、 の結果を知る必要がありますz
。しかし...
優先順位は評価の順序と同じではないことに注意してください。個々の式x++
、--y
、b
、およびは、任意の順序a
で評価できます。コンパイラは、次に、次に、次に評価することを選択できます。コンパイラは、 を評価する前に評価することを選択する場合があります。コンパイラは、 への結果の割り当て後まで、への副作用の適用を延期することを選択する場合があります。 x++
a
b
--y
--y * b / a
x++
x++
--y
z
これらの 2 つは、操作の順序に従って同等です。
z = x++ - --y * b / a;
z = (x++) - (((--y) * b) / a);
y
=
は の前にあるため操作の前に減少し、の後にあるため操作の--
後に増加y
し
ます。x
=
++
x
例えば:
int i = 2, y = 3, z;
z = ++i + ++y; //3 + 4
また
int i = 2, y = 3, z;
z = --i + --y; //1 + 2
と
int i = 2, y = 3, z;
z = i++ + y++; //2 + 3
最後の例では、まだ 2 + 3 であることに注意してください。これは、++
が後でi
あり、ステートメントy
の後でインクリメントされるためです。=
これを知って、通常の操作順序を適用
(1. Parentheses 2. Exponents 3. Multiplication/Divison 4. Addition/Subtraction)
して問題を解決してください。掛け算と割り算のセグメントは互いに隣り合っているため、その部分を左から右に読むだけです。
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
y = --y
y = -11
z = 5 - -11 * 2 / 4
z = 5 - -22 / 4
z = 5 - -5
z = 10
x = 5++
x = 6
これが私の思考プロセスです: 私は and の位置に基づいて and の値を解釈しx
、次にその値を掛けてから割り、次にその値を に加算し、最後に をインクリメントします。掛け算と割り算が隣り合っている場合は、左から右に読んでください。y
++
--
-y * b
a
x
x