sách gpt4 ăn đã đi

java - Tại sao "a^=b^=a^=b;" khác với "a^=b; b^=a; a^=b;"?

In lại Tác giả: IT Lão Cao 更新时间:2023-10-28 20:49:38 29 4
mua khóa gpt4 giày nike

我尝试了一些代码来交换 Java 中的两个整数,而不使用第三个变量,使用 XOR。

这是我尝试过的两个交换函数:

package lang.numeric;

public class SwapVarsDemo {

public static void main(String[] args) {
int a = 2984;
int b = 87593;
swapDemo1(a,b);
swapDemo2(a,b);
}

private static void swapDemo1(int a, int b) {
a^=b^=a^=b;
System.out.println("After swap: "+a+","+b);
}

private static void swapDemo2(int a, int b) {
a^=b;
b^=a;
a^=b;
System.out.println("After swap: "+a+","+b);
}

}

这段代码产生的输出是这样的:

After swap: 0,2984
After swap: 87593,2984

我很想知道,为什么会有这样的说法:

        a^=b^=a^=b;

和这个不一样?

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

câu trả lời hay nhất

问题是评估的顺序:

JLS section 15.26.2

First, the left-hand operand is evaluated to produce a variable. If this evaluation completes abruptly, then the assignment expression completes abruptly for the same reason; the right-hand operand is not evaluated and no assignment occurs.

Otherwise, the value of the left-hand operand is saved and then the right-hand operand is evaluated. If this evaluation completes abruptly, then the assignment expression completes abruptly for the same reason and no assignment occurs.

Otherwise, the saved value of the left-hand variable and the value of the right-hand operand are used to perform the binary operation indicated by the compound assignment operator. If this operation completes abruptly, then the assignment expression completes abruptly for the same reason and no assignment occurs.

Otherwise, the result of the binary operation is converted to the type of the left-hand variable, subjected to value set conversion (§5.1.13) to the appropriate standard value set (not an extended-exponent value set), and the result of the conversion is stored into the variable.

所以你的表达方式是:

a^=b^=a^=b;

  1. 评估 Một
  2. 评估 b^=a^=b
  3. xor 两者(所以第一步中的 Một 还没有应用 ^=b)
  4. 将结果存储在 Một

也就是说,你的表达式等价于下面的java代码:

    int a1 = a;
int b2 = b;
int a3 = a;
a = a3 ^ b;
b = b2 ^ a;
a = a1 ^ b;

你可以从你的方法的反汇编版本中看到:

  private static void swapDemo1(int, int);
Mã số:
0: iload_0
1: iload_1
2: iload_0
3: iload_1
4: ixor
5: dup
6: istore_0
7: ixor
8: dup
9: istore_1
10: ixor
11: istore_0

关于java - 为什么 "a^=b^=a^=b;"与 "a^=b; b^=a; a^=b;"不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22044163/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress