Java运算符优先级分析

发布时间 2023-04-16 19:17:47作者: 为了生活更好
package com.zt.javase01;

public class Test2 {
    public static void main(String[] args) {
        int n = 10;
        n += (n++) + (++n);
        System.out.println(n);//输出32

        /*


         (n++) (++n)
            从左到右执行
            因此(n++)表达式的值10 n的值变为了11
            (++n) 的表达式的值变为了12 n的值变为了12
         +  (n++)+(++n)整个表达式的值变为了22
         += n+=的这个n不好分析, 要分析得从操作数栈和局部变量表的角度
        */

        /*
        *
        字节码分析 下面是用javap反编译class得到的字节码指令指令
方法执行时栈有局部变量表和操作数栈区域, 局部变量表一般存储变量, 操作数栈是用来运算的, 但是i++和==i对应的inc指令可以不通过操作数栈直接为局部变量自增 javap -c com.zt.javase01.Test2 Compiled from "Test2.java" public class com.zt.javase01.Test2 { public com.zt.javase01.Test2(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: bipush 10 //将10压到操作数栈 此时栈中数据为10 2: istore_1 //从操作数栈中弹出10保存到局部变量表第1个槽位 int n = 10; 3: iload_1 //从局部变量表取10 取到操作数栈 此时栈中数据 10 n+=的n入操作数栈 4: iload_1 //从局部变量表取10 到操作数栈 此时栈中数据 10 10 n++的n入操作数栈 5: iinc 1, 1 //局部变量表中第1槽的值自增1变为11 n++ 8: iinc 1, 1 //局部变量表中第1槽的值自增1变为12 ++n 11: iload_1 //从局部变量表中取值12到操作数栈 此时栈中数据 12 10 10 ++n的n入操作数栈 12: iadd //求和 从栈中弹出12 10求和并压到栈顶 也就是现在栈变成了 22 10 求(n++)和(++n)的值 13: iadd //弹出22和12 求和 得到32 14: istore_1 // 从操作数栈弹出32放到局部变量表1的位置 15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; //获取对象 18: iload_1 //从局部变量表读取数值32 19: invokevirtual #3 // Method java/io/PrintStream.println:(I)V //打印 22: return } Process finished with exit code 0 * * */ } }