【发布时间】:2015-05-23 14:42:23
【问题描述】:
在这段代码中:
int y = 10;
int z = (++y * (y++ + 5));
我的预期
第一个y++ + 5 将被执行,因为最内层括号的优先级。所以y 的值为11,这个表达式的值为15。然后++y * () 将被执行。所以 12 * 15 = 180。所以 z=180
我得到了什么
z=176
这意味着虚拟机从左到右不遵循运算符优先级。那么我对运算符优先级的理解是错误的吗?
【问题讨论】:
-
优先级并不代表事情的执行顺序。
-
@Caramiriel 我有 99% 的把握这不是生产代码——这只是对语言和编译器的刺激和戳,OP 觉得他们发现了一些意想不到的东西。
-
@Loko 基本数学没有像
y++这样的结构,因为基本数学没有可变变量(据我所知)。 -
你对运算符优先级的理解是错误的;这是一个非常普遍的误解,许多初学者书籍对此的解释完全错误。这些文章是关于 C# 的,但这些原则同样适用于 Java;他们可能会帮助你。 ericlippert.com/tag/precedence
-
要理解的关键是优先级决定了 operators 的执行顺序,而不是 operands 的执行顺序。
A() + B() * C()保证乘法运算发生在加法之前。A()的调用既不是乘法也不是加法,因此对于A()是否发生在B()和C()之前,优先级没有任何意义。跨度>
标签: java operators operator-precedence