在表达式中使用赋值运算符

Using assignment operator inside of expression

提问人:bhusak 提问时间:12/29/2018 最后编辑:Tom Hawtin - tacklinebhusak 更新时间:12/29/2018 访问量:127

问:

运行此代码将返回 11,而我期望返回 20。为什么会这样?

int x = 1;
int y = x + (x = 10);
System.out.println(y);
Java 算符 值-运算符 -优先级

评论

3赞 Nicholas K 12/29/2018
你为什么期待 20 岁?
4赞 Tom Hawtin - tackline 12/29/2018
评估从左到右。
0赞 bhusak 12/29/2018
@NicholasK因为我不赋值 (x = 10),我认为赋值将首先被评估,然后 x 值将为 10
0赞 bhusak 12/29/2018
@TomHawtin-tackline明白了。所以 (x = 10) 括号不算数?
2赞 Tom Hawtin - tackline 12/29/2018
@bhusak括号只影响解析,所以 'x = 10 + x' 与 不同。(x = 10) + x

答:

3赞 2 revsT.J. Crowder #1

评估从左到右。所以

int y = x + (x = 10);

是(最初):x1

int y = 1 + 10;

把作业放进去并不能让它排在第一位。它只是确保它是一个有效的表达式,因为需要分配给不是变量的东西()。()y = x + x = 10y = (x + x) = 10x + x

如果想要 20 个,请将作业放在第一位:

int y = (x = 10) + x;

当然,绝大多数情况下,最好避免这些副作用,并在表达式之外分配一个值,必要时分解表达式。表达式中的赋值有时很有用(尤其是诸如此类的事情),但仅限于有限的情况下。xwhile ((blah = getNextBlah()) != null)