结合任务和副作用的陷阱

偶尔我们会看到 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 的模数潜在问题。