※ 引述《oohay (五黑)》之銘言:
: http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
: 再查一下Java spec,目錄15.7 Evaluation Order的前子目二似乎說明了一切:
: 15.7.2 Evaluate Operands befor Operation
雖然這個 undefined behaviour 問題好像被提過很多次了,
也被板上許多先進罵過很多次了,這次看來是大家都已經懶得講了,
本板置底的 C語言 10 誡第九條也寫得清清楚楚,
不過拿來和 Java 比較倒是似乎沒有看過(?)
就您文中舉出的 Java spec,其實我覺得 15.7.1 的條目有一段
比較重要:
15.7 Evaluation Order
15.7.1 Evaluate Left-Hand Operand First
/* ... */
class Test {
public static void main(String[] args) {
int a = 9;
a += (a = 3); //first example
System.out.println(a);
int b = 9;
b = b + (b = 3); //second example
System.out.println(b);
}
}
prints:
12
12
/* ... */
Note that both of these examples have unspecified behavior in C,
according to the ANSI/ISO standard.
上面那兩個例子和 i = i++; 或是 cout << i + i++; 之類都是類似的狀況,
我認為可以說是在 Java 中這種詭異兼無聊(?)的操作有被明確定義 order,
但是 ISO C/C++ 標準中「有明確定義這種操作會造成未定義行為」
未定義行為就是做 compiler 的人說了算。
不知道為何台灣的大學教授特愛考這種東西,點點點。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.72.57.78
※ 編輯: linjack 來自: 203.72.57.78 (02/03 13:36)