亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java中,三目運算符的結合性,究竟是從左向右還是從右向左?

Java中,三目運算符的結合性,究竟是從左向右還是從右向左?

飲歌長嘯 2018-07-13 09:57:51
首先,書上說是自右向左,甚至JLS中也明確說明“The conditional operator is syntactically right-associative (it groups right-to-left). Thus, a?b:c?d:e?f:g means the same as a?b:(c?d:(e?f:g)).”但是,如果是右結合性,有什么辦法證明嗎?我自己試著寫了個證明的例子,但是結果卻像是在告訴我——三目運算符的結合性是自左向右的。如果是自右向左的結合性,那么(++y) == 2 ? 0 : -1 應該先被執行,也就是說y的值應該是2。但結果確是1……我理解的結合性就是指在優先級相同的情況下,看是從左向右還是右向左。 自問自答吧。stackoverflow上找到一種解釋,我覺得還蠻不錯。就用a?b:c?d:e來說。如果是左結合性,那么表達式等值于下((a?b:c)?d:e)。于是乎變成了用(a?b:c)的結果,去決定究竟是返回d或者e。也就是說這個表達式只可能返回d或者e。這顯然是不正確的。
查看完整描述

4 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

結果能出現1,說明確實是右結合,

y!=2說明(++y)沒執行,也說明三目運算翻譯成字節碼時只轉換成對應的邏輯跳轉結構,只有邏輯為真的分支才會執行


查看完整回答
反對 回復 2018-07-14
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

題主你這個不是運算符優先級的問題 

 

你的問題是下面這個情況

fn1() ? fn2() : fn3();  

三個函數那個先執行,顯然fn1是最先執行的,然后根據結果執行fn2或者fn3

而書上說的 a?b:c?d:e  等價 a?b:(c?d:e)   是和 (a?b:c)?d:e 這個的區分

 

再舉一個更加普通的例子 

fn1() + fn2() * fn3();  

雖然乘號優先級比加號高 但是計算的時候 三個函數執行順序還是 fn1, fn2, fn3,就算你括號括起來 順序也還是不變


查看完整回答
反對 回復 2018-07-14
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

結合順序和執行順序是不同的,舉個簡單的例子:

a?b:c?d:e?f:g的結合順序有:a?b:((c?d:e)?f:g)或a?b:(c?d:(e?f:g))兩種結合方式,所以第二種才是從右向左的結合方式,而表達式的執行順序都是從左向右


查看完整回答
反對 回復 2018-07-14
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

為什么不加個括號呢,糾結這些個人感覺并沒有實際的意義。興許你覺得這涉及到原理什么的,可是編程時解決實際問題來著,并不是讓你無謂的給自己增加困擾。

查看完整回答
反對 回復 2018-07-14
  • 4 回答
  • 0 關注
  • 2203 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號