我在一个声明中苦苦挣扎。当我在C和PHP中执行此(类似)时,我的回答为5.但是相同的代码在Java中产生4。有人可以解释这种差异。
int x=1,y=1;
x+=y+=x+=y;
我们担心执行后x的值。
答案 0 :(得分:2)
在C中,表达式x+=y+=x+=y
的行为是未定义;字面上任何结果都是可能的。问题是,除少数例外情况外,C没有指定评估表达式或应用副作用的顺序;我无法保证x
或y
按任何特定顺序更新(+=
运算符不会引入序列点)。因此,结果将在平台,构建等之间变化。从运行到运行甚至不必相同,尽管在实践中它将是。
是的,表达式解析为x+=(y+=(x+=y))
,但这并不意味着x
的价值立即更新 评估最右边的x+=y
。
这里有一个可能的评估和副作用序列,可以解释输出:
t0 <- x + y // t0 == 2
t1 <- y + t0 // t1 == 3
y <- t1 // y == 3
x <- t0 // x == 2
x <- x + t1 // x == 5
与C不同,Java强制执行特定的评估顺序和副作用(从左到右评估所有内容,立即应用副作用),因此结果在Java中定义良好。
不是关于PHP的线索。