首页 > 编程语言 >Java运算符优先级分析

Java运算符优先级分析

时间:2023-04-16 19:23:43浏览次数:32  
标签:10 操作数 12 优先级 ++ 局部变量 运算符 Test2 Java

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 * * */ } }

字节码指令官方文档:
https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-6.html#jvms-6.5.iload_n

  

标签:10,操作数,12,优先级,++,局部变量,运算符,Test2,Java
From: https://www.cnblogs.com/littlezt/p/17323851.html

相关文章

  • 存储类、运算符
    C存储类​ 存储类定义C程序中变量/函数的的存储位置、生命周期和作用域。这些说明符放置在它们所修饰的类型之前。下面列出C程序中可用的存储类:autoregisterstaticexternauto存储类auto存储类是所有局部变量默认的存储类。定义在函数中的变量默认为auto存储类,这......
  • Java编码
    有关编码的基础知识1.位bit最小的单元字节byte机器语言的单位1byte=8bits1B=1byte1KB=1024B1MB=1024KB1GB=1024MB 字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符号,数字等。字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。字符编码:......
  • 深入理解 Java 的整型类型:如何实现 2+2=5?
    在开始关于Java的整型类型讨论之前,让我们先看下这段神奇的Java代码:publicstaticvoidmain(String[]args)throwsException{doSomethingMagic();System.out.printf("2+2=%d",2+2);}执行结果,控制台打印的内容:2+2=5那么doSomethingMagic方法......
  • js 传递汉字 乱码_JavaScript 字符串反转乱码问题解决
    https://blog.csdn.net/weixin_36483301/article/details/113451892emoji表情和非常用字实际解决中文编码问题,可以通过解码解决js中使用decodeURL即可解决......
  • java反射
    java反射1.基本定义Java反射机制是在运行状态时,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。可以说为对象可以通过......
  • Java中abstract(抽象类)
    1、概述(1)只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上就是没有“{}”。使用abstract修饰符来表示抽象方法和抽象类。(2)abstract修饰符表示所修饰的类没有完全实现,还不能实例化。如果在类的方法声明中使用abstract修饰符,表明该方法是一个......
  • Java JDBC批处理添加出现问题,求解决方案
    晚辈使用JDBC批处理时出现一个问题,使用addBatch()方法将记录加入批处理中,我想让这五千条记录每达到一千条记录再执行,以此提高效率,可最后执行在数据库查看时仅五条记录,我尝试将 preparedStatement.executeUpdate();提出if语句,虽然是有五千条记录,但效率相当的慢请求前辈们给出解决......
  • java多版本共存
    原理通过脚步改变path环境变量来实现java多版本切换.这里使用的是Win10.一,删除原有的java搜索路径.在安装高版本的java时,会添加一个路径到path环境变量中,如我的C:\ProgramFiles\CommonFiles\Oracle\Java\javapath,在该目录下存有java.exe和javac.exe等.在用cmd执行命令时,......
  • java语句
    语句语句是以;或}或)结尾的一段代码,目的是执行某些操作,并且没有返回值。语句块和方法体也算语句。所以,语句是可以嵌套的。函数体是一个有名称的语句。对于拥有子语句的语句,称为复合语句,否则就是简单语句。 简单语句空语句:;;;方法调用语句:setVal(34);表达式语句:i......
  • javascript 把嵌套的 map 转成 object,再转 json 字符串
    使用JSON.stringify转map时发现并没有转成想要的JSON数据,搜索发现要转成Object才能够转成完整的JSON,用递归转换:constconvertNestedMapToObject=(map)=>{if(mapinstanceofMap){map.forEach((v,k)=>{......