作者LPH66 (-858993460)
看板java
标题Re: [问题] 未定义行为?
时间Thu Oct 27 12:27:10 2011
※ 引述《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
1F:推 x000032001:推 感谢解答 10/27 19:47