java 板


LINE

※ 引述《chchwy (mat)》之銘言: : JAVA的三元運算子?:似乎限制頗多 : 比如說 下面這句 : (x==9)?i++:j++; : 單獨存在的話compile竟然不會過 : 一定要改成下面的樣子才會過 : int y=(x==9) i++:j++; : 就是左邊一定要有一個assingment敘述 : 這我實在百思不得其解 : 也不能插入一個以上的statement,像這樣 : int y= (x==9) ? (a=1, b=1) : (j++); : 這些在C++裡都是合法的敘述 : 為什麼拿到JAVA來就都行不通了呢? : 有沒有什麼書或網站有介紹JAVA在?:運算子上的限制呢? : 感謝各位 從Java Language Specification裡來挖資料吧: 這個是Java完整的BNF文法: http://java.sun.com/docs/books/jls/third_edition/html/syntax.html 首先是 ?: 本身, 它是以Expression的一部份出現: Expression: Expression1 [AssignmentOperator Expression1]] Expression1: Expression2 [Expression1Rest] Expression1Rest: ? Expression : Expression1 (以下略) 所以可以知道整個 ?: 是被當成一個Expression 然後是可以單獨寫在一行的Expression: Statement: (中略) StatementExpression ; StatementExpression: Expression 看來這份文法並沒有禁止這種東西 來看看詳細的說明吧: http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.8 它裡面只給 Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression MethodInvocation ClassInstanceCreationExpression 這七種Expression可以當成Statement來用 Assignment 是指 = += -= 等等的 http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.26 PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression 這四個是++和-- http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.15 MethodInvocation 是method的呼叫 http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12 ClassInstanceCreationExpression 是new的使用 http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9 這七種都不是?:的 ConditionalExpression http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.25 因此?:自然不能當成statement來用了 回頭看14.8有這麼一段字: Unlike C and C++, the Java programming language allows only certain forms of expressions to be used as expression statements. Note that the Java programming language does not allow a "cast to void" - void is not a type - so the traditional C trick of writing an expression statement such as: (void) ... ; // incorrect! does not work. On the other hand, the language allows all the most useful kinds of expressions in expressions statements, and it does not require a method invocation used as an expression statement to invoke a void method, so such a trick is almost never needed. If a trick is needed, either an assignment statement (§15.26) or a local variable declaration statement (§14.4) can be used instead. 這應該回答了你的第一個問題了 第二個問題就要回到 , 這東西上面了 C語言的 , 可以拿來串expression 但java沒有這種用法 (例如你直接寫一行 i=1,j=2; 同樣也不會過) 於是自然不能這樣插入了 --- 換個方式想, java大概當初設計時就是要讓人寫出比較容易看得懂的code 所以這種奇怪的寫法自然一開始就不讓你寫 與其寫 (x==9)?i++:j++; 還不如寫 if(x==9){i++;}else{j++;} 至少我認為後者的可讀性比前者好 (雖然我在寫C時也常常寫前者(遮臉)) -- 說起來這下換我搞不懂了... 上面那七種Expression 前六種很好理解 但第七種這...有人會直接寫 new xxx(); 然後不指定給變數也不接別的東西嗎 @_@ (似乎一new出來結束後就會變成gc候選... 這樣它做的事好像只能在constructor裡面的樣子 這到底能有什麼用途 @_@ 和static method的功能重覆了不說 甚至感覺起來比static method還差...) -- [LPH] Oops, your OOP's a problem? 說: 你現在還是看不到狗? ************* 說: 看得到 只是 他們不會跑 就一直呆呆在那邊 一直在起點 [LPH] Oops, your OOP's a problem? 說: 你要按"ㄅㄧㄤˋ"它們才會跑啊@@" --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.250.80
1F:推 godfat:有時候我會這樣寫:(new Main()).run(); 就用過即丟這樣 10/20 20:39
2F:→ LPH66:這個是後面有接 它算是MethodInvocation那種情形 10/20 21:17
3F:→ LPH66:可是那第七種情形就是只有new而已 前面沒變數接後面沒呼叫 10/20 21:19
4F:→ LPH66:我想不到java為什麼要允許這種Expression可以寫成statement 10/20 21:21
5F:推 godfat:喔,我懂你的意思了,那這樣寫就真的很奇怪了... 10/20 22:25
6F:推 godfat:也許... new Widget(parent); 這樣?反過來比較好就是了... 10/20 22:27
7F:推 H45:new Thread().start(); 這也是第七種,懶人寫法 XD 10/21 07:41
8F:→ H45:喔,我懂意思了,這種有 new JFrame(); 一個 GUI 程式。 10/21 07:43
9F:推 chchwy:原來如此呀 那是語言先天設計上的限制囉 感謝您~~ 10/27 11:41







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job 或 站內搜尋

TOP