首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有temp的单行交换在Java中不能工作?

没有temp的单行交换在Java中不能工作?
EN

Stack Overflow用户
提问于 2016-10-27 12:10:46
回答 1查看 75关注 0票数 0

我在java中尝试了“在Java中交换变量而不使用temp”,我发现了一些让我困扰的东西:

代码语言:javascript
复制
int a = 1, b = 2;
b^= a ^= b ^= a;
System.out.println(a + " vs " + b);

输出如下所示

代码语言:javascript
复制
2 vs 0

但是,如果我将最左边的赋值分隔为单独的语句:

代码语言:javascript
复制
int a = 1, b = 2;
a ^= b ^= a;
System.out.println(a + " vs " + b);
b^=a;
System.out.println(a + " vs " + b);

输出为

代码语言:javascript
复制
2 vs 3
2 vs 1

现在,输出与预期一致。

在C++中,评估是从右到左进行的。在语言规范方面的区别是什么,告诉Java可以引领这样的预期结果?

EN

回答 1

Stack Overflow用户

发布于 2016-10-27 12:20:12

根据JLS的说法,x ^= y等同于x = (x) ^ (y) (其中也有一个强制转换,但如果您处理的是整数,那么强制转换无论如何都无关紧要)。所以这就是:

代码语言:javascript
复制
b ^= a ^= b ^= a;

等同于

代码语言:javascript
复制
    b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
//      ^^^

在Java中,运算符的参数总是从左到右进行计算。因此,我在上面指出的bb的原始值,因为它是在向表达式右侧的b赋值之前计算的。这意味着该表达式不等同于

代码语言:javascript
复制
b ^= a;
a ^= b;
b ^= a;   

因为第三条语句使用的新b作为^的左操作数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40275969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档