结合任务和副作用的陷阱
偶尔我们会看到 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 的模数潜在问题。