結合任務和副作用的陷阱

偶爾我們會看到 StackOverflow Java 問題(以及 C 或 C++問題),它們會問這樣的事情:

i += a[i++] + b[i--];

評估為…對於 iab 的一些已知初始狀態。

一般來說:

  • 對於 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 的模數潛在問題。