3

以下に示す単純な Java 式があります。Operator Precedence tableに基づいて、この式は 0 による除算の例外を返し (後置インクリメント演算子の優先順位が最も高いため)、結果の式が次のようになると予想します。

2 + 2 + 5 / 0

しかし、結果は 7 です。なぜですか? (少し実験したところ、何らかの理由ですべての演算子に値 1 が割り当てられていることがわかりましたが、優先度テーブルが正しい場合、これは意味がありません)

int intCountOperator = 0;
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
System.out.println(unaryOperand); // Prints 7
4

3 に答える 3

2

演算子の優先順位は評価順序を制御しません。式の読み取り方法のみを制御します。たとえば、掛け算は足し算よりも優先順位が高いため、 ではなくx + y * zと読みます。ただし、最初に が評価され、次に最後にが評価されることに変わりはありません。x + (y * z)(x + y) * zxyz

通常、意味のある読み方は 1 つしかないため、++andで良い例を示すのはより困難です。ただし、エラーなしでコンパイルされることに--気付くかもしれません(とが数値変数の場合)。コンパイルしないと評価されるよりも優先順位が低かった場合。y - x++xy++-(x - y)++

演算子の優先順位により、式は次のように評価されます。

(++intCountOperator) + (intCountOperator + (5 / (intCountOperator++)));

ただし、評価順序は変更されません。

于 2015-12-21T14:01:10.147 に答える
2

式は左から右に評価されます。

unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
                        1         +          1       + 5 / 1                    = 7

演算子は期待どおりの順序で評価されることに注意してください。つまり1 + 1 + (5/1) = 1 + 1 + 5 = 7、これらすべての式のオペランドは左から右に評価されます。

于 2015-12-21T13:50:42.987 に答える
1

評価の順序は、右から左ではなく、左から右です。したがって、取得している結果 7 は正しいです。

unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;

実際には

unaryOperand = 1 + 1 + 5 / 1; = 7
于 2015-12-21T13:50:50.093 に答える