精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《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)