6

http://leepoint.net/notes-java/data/expressions/precedence.htmlからの一例

次の式

1 + 2 - 3 * 4 / 5

として評価されます

1 + 2 - 3 * 4 / 5
    = (1 + 2) - ((3 * 4) / 5)
    = 3 - (12/5)
    = 3 - 2 The result of the integer division, 12/5, is 2 .
    = 1

次に、 http://www.roseindia.net/java/master-java/operator-precedence.shtmlから別の例を見ました

次の式

4 + 5 * 6 / 3

として評価されます

4 + (5 * (6 / 3))

*と/が関係する場合、どちらが最初に評価されるかがどのように決定されるかについて、私は少し混乱しています。上記の例では、どちらも違いがあるようです。

最初の例は次のように評価3*5/5して((3*4)/5) いますが、2番目の例は評価しています5*6/3 as (5*(6/3))

*と/が+と-よりも優先されることは知っていますが、式に*と/の両方が含まれている場合はどうでしょうか。また、上記の2つの例が異なるアプローチを示しているのはなぜですか?それらの1つは間違っていますか?

編集

public class ZiggyTest {  

    public static void main(String[] args) {  
            System.out.println(4 + (5 * (6 / 3)));
            System.out.println(4 + ((5 * 6) / 3));

            System.out.println(1 + 2 - (3 * (4 / 5)));  
            System.out.println(1 + 2 - ((3 * 4) / 5));  
    }  
 } 

上記のプログラムは出力を生成します

14
14
3
1

最初の出力が同じ出力を生成した場合、最後の2つの出力が同じでないのはなぜですか。

4

3 に答える 3

11

*と/が関係しているときにどちらが最初に評価されるかがどのように決定されるかについて少し混乱しています

だから私たちは仕様を持っています:)

セクション15.7は、評価順序を扱うJava言語仕様のセクションであり、セクション15.17は次のように述べています。

演算子*、/、および%は、乗法演算子と呼ばれます。それらは同じ優先順位を持ち、構文的に左に関連付けられます(左から右にグループ化されます)。

したがって、との両方が存在する場合は常に、A op1 B op2 Cまたはそれはと同等ですop1op2*/%

(A op1 B) op2 C

言い換えれば、2番目のリンクされた記事は彼らの例では明らかに間違っています。これを証明する例を次に示します。

int x = Integer.MAX_VALUE / 2;        
System.out.println(x * 3 / 3);
System.out.println((x * 3) / 3);
System.out.println(x * (3 / 3));

出力:

-357913942
-357913942
1073741823

これは、除算(1の乗算で終わる)ではなく、最初に乗算が発生する(整数のオーバーフローにつながる)ことを示しています。

于 2011-11-13T14:32:44.343 に答える
3

本気ですか?

4 + (5 * 6) / 3
4 + 30 / 3
4 + 10
14

4 + 5 * (6 / 3)
4 + 5 * 2
4 + 10
14

括弧を追加しても結果が変わらないため、同じ出力が生成されます。他の方程式の場合、括弧は実際に結果を変更します。私が解いた方程式の括弧を削除することにより、結果への正しいパスが最初のパスになります。

于 2011-11-13T14:36:52.060 に答える
2

2つ目は間違っています。ジョンスキートの答えを参照してください。乗法演算子は左から右に評価します。のグループ化:

4 + 5 * 6 / 3

する必要があります

4 + ((5 * 6) / 3).

ただし、この場合、間違ったグループ化

4 + (5 * (6 / 3))

同じ答えが得られます。

于 2011-11-13T14:39:50.023 に答える