在Java中运算符优先级如何判断_Java表达式计算顺序说明

Java运算符优先级从高到低关键层级为:后置++/-- > 前置++/--、!、~、+、- > *、/、% > +、- > = > ==、!= > & > && > || > 赋值类=、+=等;结合性上,赋值和三元?:为右结合,其余多为左结合。

Java 表达式不是从左到右依次算的,而是严格按 运算符优先级结合性 规则执行;写错顺序可能让 a + b * c 被误以为先加后乘,实际是先乘后加。

常见运算符优先级从高到低怎么排?

记住几个关键层级就够了,不用背全部 15 级:

  • ++--(后置) > ++--(前置) > !~+(正号)、-(负号)
  • */% 高于 +-(加减)
  • ==!= 低于 >>=
  • && 高于 ||,但都远低于关系运算符
  • =(赋值)是最低优先级之一,比几乎所有运算符都低

比如 a = b + c > d ? e : f 中,> 先算,再 ?:,最后才 = —— 不加括号极易误解。

结合性不等于优先级,但它决定同级怎么算

优先级相同才看结合性。Java 大多数二元运算符是 左结合(从左往右),但几个关键例外:

  • =+=-= 等赋值运算符是 右结合:所以 a = b = c 等价于 a = (b = c)
  • ++--(后置)是左结合,但语义上“先用后变”,和前置行为完全不同
  • ?: 是唯一三元运算符,右结合:a ? b : c ? d : e 解析为 a ? b : (c ? d : e)

混淆结合性会导致逻辑错误,比如 a = b += c 实际是 a = (b += c),不是 (a = b) += c(后者非法)。

哪些地方最容易因优先级翻车?

不是所有表达式都需要括号,但以下场景不加括号几乎必出 bug:

  • 位运算混用:a & b == c → 实际是 a &

    (b == c)
    ,因为 == 优先级高于 &;正确写法是 (a & b) == c
  • 逻辑与/或混用:a && b || c && d 没问题(&& 先于 ||),但 a || b && c 容易读错,建议写成 a || (b && c)
  • 移位和加减:a 是 a ,不是 (a ;想后者必须加括号
  • 字符串拼接 + 数学混合:"x=" + a + b * c 会先拼 "x=" + a(转字符串),再拼 b * c 结果,而非先算 b * c 再拼 —— 因为 + 对字符串是左结合且优先级低于 *,但遇到字符串后整个左边都变成字符串上下文

调试时怎么看实际计算顺序?

IDE(如 IntelliJ)把鼠标悬停在表达式上,通常能高亮显示分组结果;但更可靠的是用

javap -c
看字节码:

public static int test() {
    return 1 + 2 * 3 >> 1;
}

反编译后你会看到 iconst_2iconst_3imul(先乘),再 iconst_1ishr(右移),最后 iadd(加)—— 顺序一目了然。别依赖“我觉得它该这么算”,字节码不会骗人。

真正难的不是记住哪一级高,而是意识到 ==& 高、+ 低、以及字符串 + 在混合类型时会提前触发类型提升。这些点不写括号,过三个月自己都看不懂。