这是由于Java中的运算符优先级和关联性是如何工作的。1个
不幸的是,Oracle
Java教程仅提供了部分概述,并且Java语言规范也无济于事,因为它主要是通过声明以下内容来让操作员确定操作员的优先级:
运算符之间的优先级由语法产生的层次结构管理。
通常,表达式是从左到右计算的。就运算符优先级而言, 适用于下表2:
╔═══════╦══════════════╦══════════════════════╦═════════════════╗║ Level ║ Operator ║ Description ║ Associativity ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 16 ║ []║ access array element ║ left to right ║║ ║ . ║ access object member ║ ║║ ║ ()║ parentheses ║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 15 ║ ++║ unary post-increment ║ not associative ║║ ║ --║ unary post-decrement ║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 14 ║ ++║ unary pre-increment ║ right to left ║║ ║ --║ unary pre-decrement ║ ║║ ║ + ║ unary plus║ ║║ ║ - ║ unary minus ║ ║║ ║ ! ║ unary logical NOT ║ ║║ ║ ~ ║ unary bitwise NOT ║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 13 ║ ()║ cast ║ right to left ║║ ║ new ║ object creation ║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 12 ║ * ║ multiplicative ║ left to right ║║ ║ / ║║ ║║ ║ % ║║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 11 ║ + - ║ additive ║ left to right ║║ ║ + ║ string concatenation ║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 10 ║ << >> ║ shift ║ left to right ║║ ║ >>> ║║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 9 ║ < <= ║ relational║ not associative ║║ ║ > >= ║║ ║║ ║ instanceof ║║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 8 ║ ==║ equality ║ left to right ║║ ║ !=║║ ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 7 ║ & ║ bitwise AND ║ left to right ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 6 ║ ^ ║ bitwise XOR ║ left to right ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 5 ║ | ║ bitwise OR║ left to right ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 4 ║ &&║ logical AND ║ left to right ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 3 ║ ||║ logical OR║ left to right ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 2 ║ ?:║ ternary ║ right to left ║╠═══════╬══════════════╬══════════════════════╬═════════════════╣║ 1 ║ = += -= ║ assignment║ right to left ║║ ║ *= /= %= ║║ ║║ ║ &= ^= |= ║║ ║║ ║ <<= >>= >>>= ║║ ║╚═══════╩══════════════╩══════════════════════╩═════════════════╝
对于您的特定问题,这意味着在强制转换操作周围无需放置任何括号,因为强制转换运算符的优先级
()高于按位与
&运算符的优先级(13级对7级)。
1我将其写成一个规范的答案,以解决有关Java中的运算符优先级和关联性的问题。我发现了很多现有的给出部分信息的答案,但是找不到完整的优先级和关联性表的概述的答案。
2运算符优先级和关联表摘自https://introcs.cs.princeton.edu/java/11precedence/。



