Java 表达式中子表达式的求值顺序
order of evaluation of subexpressions in a Java expression
我有以下代码片段:
int x=2,y=3;
if ( (y == x++) | (x < ++y) )
// rest of code
我知道在 C++ 中你被教导不要依赖子表达式的评估顺序,因为它根本不能保证是任何顺序。
所以这段代码会出错,并且条件中表达式产生的布尔值不能保证为真(例如,y 可以在第一次相等性测试中评估之前递增)。
由于我在 Java 认证书中阅读了这段代码,我假设 Java 不是这种情况。我的意思是,我是否保证 Java 中的评估顺序始终是左到右?所以上面的表达式应该总是 true.
是的,它保证从左到右执行 - 或者至少,表现得好像是这样。这在 JLS 15.7:
中定义
The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.
|
运算符的第一个操作数将评估 3 == 2,并得出 false,但第二个操作数将评估 3 < 4,并得出 true。
话虽如此,我肯定会避免需要仔细阅读的代码...
我有以下代码片段:
int x=2,y=3;
if ( (y == x++) | (x < ++y) )
// rest of code
我知道在 C++ 中你被教导不要依赖子表达式的评估顺序,因为它根本不能保证是任何顺序。 所以这段代码会出错,并且条件中表达式产生的布尔值不能保证为真(例如,y 可以在第一次相等性测试中评估之前递增)。 由于我在 Java 认证书中阅读了这段代码,我假设 Java 不是这种情况。我的意思是,我是否保证 Java 中的评估顺序始终是左到右?所以上面的表达式应该总是 true.
是的,它保证从左到右执行 - 或者至少,表现得好像是这样。这在 JLS 15.7:
中定义The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.
|
运算符的第一个操作数将评估 3 == 2,并得出 false,但第二个操作数将评估 3 < 4,并得出 true。
话虽如此,我肯定会避免需要仔细阅读的代码...