結合任務和副作用的陷阱
偶爾我們會看到 StackOverflow Java 問題(以及 C 或 C++問題),它們會問這樣的事情:
i += a[i++] + b[i--];
評估為…對於 i
,a
和 b
的一些已知初始狀態。
一般來說:
- 對於 Java,答案總是指定 1 ,但不明顯,往往很難弄清楚
- 對於 C 和 C++,答案通常是未指定的。
這些示例通常用於考試或求職面試,以試圖瞭解學生或受訪者是否理解表示式評估在 Java 程式語言中是如何工作的。這可以說是合法的知識測試,但這並不意味著你應該在真正的程式中做到這一點。
為了說明,下面看似簡單的例子在 StackOverflow 問題中出現過幾次(比如這個 )。在某些情況下,它似乎是某人程式碼中的真正錯誤。
int a = 1;
a = a++;
System.out.println(a); // What does this print.
大多數程式設計師(包括 Java 專家) 快速閱讀這些陳述會說它輸出了 2
。事實上,它輸出 1
。有關原因的詳細說明,請閱讀本答覆 。
但是由此而類似的例子真正的外賣是任意的 Java 語句都分配給和副作用相同的變數將是最好難以理解,並在最壞的情況徹頭徹尾的誤導。你應該避免編寫這樣的程式碼。
1 - 如果變數或物件對其他執行緒可見,則使用 Java Memory Model 的模數潛在問題。