簡體   English   中英

三元運算符,使用賦值時出現語法錯誤

[英]Ternary operator, syntax error when using assignment

下面的3行代碼編譯好了。 (請注意,此代碼是“人工Java編碼”的示例,因此在專業編寫的代碼中不會出現。)

int x, y;
boolean b=true;

x = b ? y=1 : 2;  // Compiles OK.

如果我現在更改上面第3行中的代碼,使其看起來像下面的代碼行,編譯器會生成錯誤。

// Change the position of the "y assignment", and now the code doesn't compile.
x = b ? 1 : y=2;  

這是語法錯誤消息:

三元運算符語法錯誤

有人可以解釋這種行為(對新手Java學習者)嗎? 謝謝。

簡短

這是因為運營商優先。 第一種情況與此相同:

x = (b ? (y=1) : 2);  // Compiles OK.

而第二個是:

x = (b ? 1 : y) = 2;  

第一個編譯確實很好,因為賦值被評估為新值。 所以,如果b為真,它將導致xy等於1.第二個就像是說: x = 1 = 2 所以,是的,要修復此編譯器錯誤,請在您的語句中添加一些paratheses:

x = (b ? 1 : (y = 2));  // Outer () are not needed, but is clearer, IMHO.

更長時間

首先, Java中的運算符優先級表示賦值運算符的優先級低於條件三元運算符。 這意味着您的第二個表達式相當於:

x = (b ? 1 : y) = 2;

如你所見,這看起來很明顯。 的確, JLS§15.26說:

有12個賦值運算符; 所有這些都是語法上的右關聯 (他們從右到左分組)。 因此, a=b=c表示a=(b=c) ,它將c的值賦給b ,然后將b的值賦給a

賦值運算符的第一個操作數的結果必須是變量 ,否則會發生編譯時錯誤。 (這解釋了您面臨的編譯時錯誤)

在運行時,賦值表達式的結果是賦值發生后變量的值。 賦值表達式的結果本身不是變量。

應用權利相關性:

x = ((b ? 1 : y) = 2);

最后,我們可以看到為什么會產生編譯器錯誤:三元條件運算符的結果不是變量 (實際上我沒有找到它在JLS中,但是編譯器會在一個簡單的測試用例中告訴你這樣的變量https//ideone.com/kMr7Xv )。

請參閱“Java運算符優先級”。 同時,使用:

x = (b ? 1 : (y=2)); 

Java運算符優先級如下

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

這里ternaryassignment操作之前。 所以你的陳述將是這樣的

x =(三元評估)=分配值

如果你仍然想要y的設定值,當b為假時,你可以使用()代表'y = 2'進行內部三元評估。

x = b ? 1 : (y=2);

兄弟,試着把表達放在括號中。

X =(b≤1:(y = 2));

這樣可以正常工作。

暫無
暫無

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

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