簡體   English   中英

一個簡單的Java代碼會返回一些意外結果

[英]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的定義,必須為零。

為了完整起見,以下是使用提供的xy值進行的遍歷:

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

問題是,我不確定在語言規范中哪里可以找到它。 我最接近的是:

15.7.2運算前評估操作數

Java編程語言還保證在執行操作本身的任何部分之前,對運算符的每個操作數(條件運算符&&,||和?:除外)都應進行完全評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM