Java 表达式中子表达式的求值顺序

Posted

技术标签:

【中文标题】Java 表达式中子表达式的求值顺序【英文标题】:order of evaluation of subexpressions in a Java expression 【发布时间】:2015-12-21 17:17:28 【问题描述】:

我有以下sn-p的代码:

int x=2,y=3;
if ( (y == x++) | (x < ++y) )
// rest of code

我知道在 C++ 中你被教导不要依赖子表达式的求值顺序,因为它根本不能保证是任何顺序。 所以这段代码会出错,并且条件中的表达式产生的布尔值不能保证为真(例如,在第一次相等测试中评估之前,y 可以递增)。 由于我在 Java 认证书中阅读了此代码,因此我认为 Java 不是这种情况。我的意思是,我是否保证 Java 中的评估顺序总是从左到右?所以上面的表达式应该总是为真。

【问题讨论】:

“我的意思是,我保证Java中的评估顺序总是从左到右”。是的。 google.com/… 谷歌搜索让我回到 *** 很有趣:D 别忘了| 不同于|| @jhamon 是的;我知道。它们也有不同的含义和不同的优先级! (| 具有更高的优先级,我明白了..) 【参考方案1】:

是的,它保证从左到右执行 - 或者至少,就好像它是一样的。这是在JLS 15.7 中定义的:

Java 编程语言保证运算符的操作数似乎按照特定的计算顺序进行计算,即从左到右。

| 运算符的第一个操作数将计算 3 == 2,并产生 false,但第二个操作数将计算 3

话虽如此,我肯定会避免需要仔细阅读的代码......

【讨论】:

以上是关于Java 表达式中子表达式的求值顺序的主要内容,如果未能解决你的问题,请参考以下文章

如果表达式的求值需要对引用求值,为啥它不是“核心常量表达式”?

栈的应用 -- 无括号表达式的求值

刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

Stack实现表达式的求值

Dijkstra的双栈算术表达式的求值算法

练习4.3