Re: [問題] 未定義行為?
※ 引述《x000032001 (某數..失業中)》之銘言:
: 在同一式子裡對變數超過一次的賦值
: 在java裡算是未定義行為嗎
: 如果不算的話 編譯後運算的順序是?
: 我在網路上查到java的作法是開一塊記憶體作暫存
: 那以我下面的這兩題來說 三個變數都同樣指向同一塊記憶體位置嗎
: 運算的順序是由左往右結合嗎
: 附上兩題我很想吐槽的題目...
: 請問以下程式的輸出為何
: int a=85;
: if (a++==85 && ++a==86 && --a==85)
: System.out.print(a);
: else
: System.out.print(a);
: int a = 5;
: a = (a++) + (a++) + (++a);
: System.out.println("a="+a);
昨天事情有點多所以只推了一行而已
現在沒事了就來爬 JLS 吧:
依 15.7 規定
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7
15.7.1 Evaluate Left-Hand Operand First
也就是所有二元運算子左邊會完整結束後才會開始算右邊
15.7.2 Evaluate Operands before Operation
除了 && || ?: 之外其他所有運算子都是在運算元完整結束後才開始運算
所以 問題一:
a++==85 && ++a==86 && --a==85
a++ (得值 85, a=86)
85 (得值 85)
== (得值 true)
&& (前者得值 true 故執行後方)
++a (剛開始時 a==86, 故得值 87, a=87)
86 (得值 86)
== (得值 false)
&& (前者得值 false 故得值 false 並結束求值)
於是印出 87
問題二:
a = (a++) + (a++) + (++a);
a++ (得值 5, a=6)
a++ (剛開始時 a==6, 故得值 6, a=7)
+ (5+6 = 11)
++a (剛開始時 a==7, 故得值 8, a=8)
+ (11+8 = 19)
= (a=19)
於是印出 a=19
以上
對 Java 來說這的確不是「未定義行為」 因為 JLS 對它們有完整的規定
但我覺得會出這個題目的老師實在也不怎麼樣就是了
(這只不過是老師枱面上搞不過學生只好出這種奧步來在枱面下整學生而已...= =)
--
いああオレたちには見えてるモノがあるbデ きっと誰にも奪われないモノがあるはずさ
け 開口一番一虚一実跳梁跋扈形影相弔yュL羊頭狗肉東奔西走国士無双南柯之夢 歪も
ぶ 意味がないと思えるコトがある ラPきっとでも意図はそこに必ずある んの
く 依依恋恋空前絶後疾風怒濤有無相生 ラH急転直下物情騷然愚者一得相思相愛 だが
ろ 無意味じゃない ラ6あの意図が 恋た
で 有為転変死生有命蒼天已死黄天當立 !!6五里霧中解散宣言千錯万綜則天去私 のり
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.92
推
10/27 19:47, , 1F
10/27 19:47, 1F
討論串 (同標題文章)