当前位置: 首页 > 面试题库 >

为什么在此忽略此Java运算符优先级?

宣意致
2023-03-14
问题内容

下面的代码打印出“ 3”,而不是您期望的“ 4”。

public class Foo2 {
    public static void main(String[] args) {
        int a=1, b=2;             
        a = b + a++;
        System.out.println(a);
    } 
}

我懂 后缀增量发生在加载“ a”的值之后。(见下文)。

我不太明白是为什么。后缀++的运算符优先级高于+,因此它不应该首先执行吗?

% javap -c Foo2

Compiled from "Foo2.java"
public class Foo2 extends java.lang.Object{
public Foo2();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   istore_1
   2:   iconst_2
   3:   istore_2
   4:   iload_2
   5:   iload_1
   6:   iinc    1, 1
   9:   iadd
   10:  istore_1
   11:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   14:  iload_1
   15:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   18:  return

问题答案:

Postfix ++递增变量的值,并 返回递增之前的值 。因此,operator++在您的示例中,返回值将为1,当然1 + 2将为3,然后将其赋给a。在分配时,++已经将ato 的值增加了2(由于优先),因此将=覆盖该增加的值。



 类似资料:
  • 问题内容: 我正在处理由以前的开发人员编写的代码,并在查询中说: 这个查询是什么意思?等于吗?还是语法错误? 但是它没有显示任何错误或异常。我已经知道= 在MySQL的。 问题答案: TL; DR 这是安全的相等运算符。 像常规运算符一样,将两个值进行比较,结果为(不相等)或(相等);换句话说:yields 和yields 。 与常规运算符不同,of的值没有特殊含义,因此它永远不会产生可能的结果。

  • 所有的数学运算都认为是从左向右运算的, Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。 乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。 一般而言,单目运算符优先级较

  • 问题内容: 由于Java中运算符优先级的正确性,我感到困惑。我在教程很久以前读到并具有更高的优先级高于OR,这是在提供的答案确认问题。但是,我目前正在使用《 Sun Java 6认证程序员学习指南》学习Java。本书包含以下示例: 我复制并引用了有关编译器如何处理上述代码的解释: 是,然后是或结果 为,然后打印。由于存在短路,因此对表达式进行评估,好像周围有括号。换句话说,它被评估为之前的单个表达

  • 问题内容: 在Java教程优先级表中,plus运算符的优先级仅列出一次。但是以下Java表达式: 结果如下: 这是否意味着加号运算符在用于连接字符串时具有较高的优先级,或者是说加号运算符的优先级对于字符串和数字没有什么不同,只是简单地从左到右求值? 问题答案: 总是 从左到右 流动 __ 在您的第一个示例中,string首先出现,然后是int值,因此1被视为string。 在第二个示例中,您使用的

  • 在下面的代码示例中,做什么:

  • 从高到低顺序如下: ^ not - (一元运算) * / + - ..(字符串连接) < > <= >= ~= == and or