Java 运算符优先级
Posted
技术标签:
【中文标题】Java 运算符优先级【英文标题】:Java operators precedence 【发布时间】:2012-12-13 01:49:15 【问题描述】:由于 Java 中运算符优先级的正确性,我感到困惑。我很久以前在教程中读到 AND 的优先级高于 OR,question 中提供的答案证实了这一点。但是,我目前正在使用“Sun Certified Programmer for Java 6 Study Guide”学习 Java。本书包含以下示例:
int y = 5;
int x = 2;
if ((x > 3) && (y < 2) | doStuff())
System.out.println("true");
我复制并引用编译器如何处理上述代码的解释:
If (x > 3)
是true
,并且要么是(y < 2)
,要么是doStuff()
是true
,然后打印"true"
。由于 短路&&
,表达式被评估,好像有(y < 2) | doStuff()
周围的括号。换句话说,它是 在&&
和单个表达式之前评估为单个表达式&&
之后的表达式。
这意味着|
的优先级高于&&
。是不是因为使用了“非短路OR”而不是短路OR?什么是真的?
【问题讨论】:
可能是书中的印刷错误。按位或 b/w(y<2)
和 doStuff()
没有意义。此外,解释说“要么 y
可能不是按位或,再检查一次。
|
与 ||
不同。一种是按位。另一个是合乎逻辑的。
好的,假名,不是“按位或”而是“非短路或”。
为了更容易理解,即使没有必要,我更喜欢多做一些括号。
【参考方案1】:
那是因为它使用|
运算符而不是||
,后者具有更高的优先级。 Here's桌子。
改用||
运算符,它会按照你的想法去做。
【讨论】:
也就是说,书上的解释是完全错误的。&&
运算符的短路与为什么 (y < 2) | doStuff()
被评估为好像它周围有括号一样。
@JB Nizet:该示例设置的是运算符优先级,而不是 && 的实际工作方式。令人惊讶的是,这本书缺少一个表格来展示本节中运算符的全部优先级,因此根据我以前的知识让我感到困惑。
是的,我同意这是一个愚蠢的例子。底线是运算符优先级表告诉所有
@arjacsoh:我的意思是这句话是错误的:由于短路&&,表达式被评估,就好像(y .实际上应该是: 因为 |具有比 && 更高的优先级,则表达式被评估为好像 (y .
很难看到它是如何编译的 - 布尔值 (y < 2)
会自动提升为 int 吗?【参考方案2】:
由于 && 短路,表达式的计算就像 (y
这种说法是错误的,确实毫无意义。 && 是短路运算符的事实与 (y 优先级,在 JLS ##15.22-23 中定义为 && 较低。
【讨论】:
以上是关于Java 运算符优先级的主要内容,如果未能解决你的问题,请参考以下文章