[英]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
為真,它將導致x
和y
等於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
這里ternary
在assignment
操作之前。 所以你的陳述將是這樣的
x =(三元評估)=分配值
如果你仍然想要y的設定值,當b為假時,你可以使用()
代表'y = 2'進行內部三元評估。
x = b ? 1 : (y=2);
兄弟,試着把表達放在括號中。
X =(b≤1:(y = 2));
這樣可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.