gpt4 book ai didi

java - 没有临时文件的一行交换在Java中不起作用?

转载 作者:行者123 更新时间:2023-12-01 21:15:25 25 4
gpt4 key购买 nike

我在 Java 中尝试了“在没有临时变量的情况下在 java 中交换变量”,但发现了一些让我困扰的东西:

int a = 1, b = 2;
b^= a ^= b ^= a;
System.out.println(a + " vs " + b);

输出显示

2 vs 0


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

int a = 1, b = 2;
a ^= b ^= a;
System.out.println(a + " vs " + b);
b^=a;
System.out.println(a + " vs " + b);

输出为

2 vs 3
2 vs 1

现在输出符合预期。
在 C++ 中,确保从右到左求值。就语言规范而言,有何差异表明 Java 可以导致这样的预期结果?

最佳答案

根据JLS , x ^= y相当于 x = (x) ^ (y) (那里还有一个强制转换,但如果你处理的是整数,那么强制转换并不重要)。所以这个:

b ^= a ^= b ^= a;

相当于

    b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
// ^^^

在 Java 中,运算符的参数始终从左到右计算。所以b我在上面指出的是 b原始值,因为它是在分配给 b 之前评估的在表达式的右侧部分。这意味着表达式等于

b ^= a;
a ^= b;
b ^= a;

因为第三条语句使用了 b值作为 ^ 的左操作数.

关于java - 没有临时文件的一行交换在Java中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40275969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com