int i = 10, j = 5, k;
k = f(++i) + g(++i) + j+ 25;
首先计算f(++i)
或g(++i)
吗?
如果不运行程序,你怎么知道?
假设f
和g
与
int f(int a)
{ return a; }
订单如何根据编译器而变化?
答案 0 :(得分:1)
哪个方法编译器执行拳头?
执行指令不是编译器,而是JVM。
Java编程语言保证了JVM从左到右评估运算符的操作数。来自JLS Sec 15.7:
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。
关于编译器是否可以重新组织编译类中的等效表达式的顺序,可能是出于“优化”原因的情况。这些可能会从一个Java版本变为另一个Java版本,因此通常您甚至不应该考虑它。
答案 1 :(得分:0)
除非另有修改,否则评估是从左到右。所以在这种情况下,f(++ i)首先出现。
编辑:正如@sanA指出的那样,可能存在编译器优化。在你的情况下,它不太可能(但并非不可能),因为你的功能可能有资格作为副作用。