[英]A simple Java code returns some unexpected result
以下最簡單的Java代碼返回一些意外的輸出。 讓我們看看。
package interchange;
final public class Main
{
public static void main(String[] args)
{
int x = 15;
int y = 20;
x^=y^=x^=y;
System.out.println("x = " + x + "; y = " + y);
}
}
上面的代碼在控制台上顯示以下輸出。
x = 0; y = 15
怎么樣?
根據運算符的優先級,可以像這樣重寫
x^=y; // 15 ^ 20 = 27, x = 27
y^=27; // 20 ^ 27 = 15, y = 15
x^=15; // 15 ^ 15 = 0, x = 0
您基本上x XOR x
進行x XOR x
(因為您對相同的操作數(y)兩次應用了異或運算),結果為0。
讓我們逐步評估您的表達式,在您的情況下,我們必須從右到左進行操作以遵循優先順序:
x^=y^=x^=y;
<=> y^x^y^x
<=> (y^y) ^ (x^x)
<=> (0) ^ (0)
<=> 0
XOR的運算規則為1 XOR 1 = 0和1 XOR 0 = 1和0 XOR 0 = 0
如果您認為^ =就是力量。
15二進制= 01111 20二進制= 10100
對於在一個或另一個操作數中出現的每個位,XOR返回true,但對兩個都不返回。 通過一個簡單的示例可能會有所幫助:
x = 1001
y = 1110
x ^= y => 0111
y ^= x ^= y => 1001
x ^= y ^= x ^= y = 0000
注意:
x <=> y ^= x ^= y
這意味着您最終將執行:
x ^= x
...根據XOR的定義,必須為零。
為了完整起見,以下是使用提供的x
和y
值進行的遍歷:
x = 0000 1111
y = 0001 1011
x ^= y = 0001 0100
y ^= x ^= y => 0000 1111
x ^= y ^= x ^= y => 0000 0000
我沒有實際的答案,但我認為優先不是問題。 添加括號來說明,同樣的事情發生了:
// 3 2 1
x^=(y^=(x^=y));
我從中可以期望得到的等同於:
x^=y; //1: xor x with y, update x, return the new x;
y^=x; //2: xor y with (result of 1), update y, return the new y;
x^=y; //3: xor x with (result of 2), update x, return the new x;
我認為實際上發生的是使用了初始值,這實際上意味着:
x0 = x;
y0 = y;
x = x0^y0^x0^y0; //0
y = y0^x0^y0; //15
問題是,我不確定在語言規范中哪里可以找到它。 我最接近的是:
Java編程語言還保證在執行操作本身的任何部分之前,對運算符的每個操作數(條件運算符&&,||和?:除外)都應進行完全評估。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.