【发布时间】:2015-10-08 11:24:40
【问题描述】:
考虑以下 Java 代码:
int result = 0;
for (int i = 0; i < 10; i++) {
result += 1;
}
循环执行 10 次迭代,因此result 在循环终止时保持值 10。
现在考虑以下几乎相同的代码:
int result = 0;
for (int i = 0; i < 10; i++) {
result =+ 1;
}
唯一的区别是我们现在将有效的+= 运算符替换为=+。后者可能看起来像一个运算符,但实际上不是(参见例如Oracles introduction to Java operators)。但是,在此更改之后,代码仍然可以正常编译。循环显然仍然执行 10 次迭代,但 result 将是 1 而不是 10。
这里发生的情况是=+ 的+ 部分与1 而不是= 相关联,因此代码与以下内容基本相同:
int result = 0;
for (int i = 0; i < 10; i++) {
result = +1;
}
这又与:
int result = 0;
for (int i = 0; i < 10; i++) {
result = 1;
}
新手可能会误写=+ 而不是+=,这似乎很合理。事实上,我记得几年前我开始学习 Java 时自己也是这样做的。
这种行为本质上是由于 Java 允许在运算符和操作数之间使用任意空格(包括 no 空格)以及显式指定数字为正数的能力(如 @987654337 @)。
从某种意义上说,允许任意空格似乎是有益的,因为您可以按照自己的喜好构建代码。 但是,允许明确的正数有什么好处?显然(幸运的是)它确实不会将已经为负数的数变成正数:
int value = -42;
value = +value;
// value is still -42.
这里一定有一些我遗漏的东西,保证了新手可能会因为这个设计决定而遇到额外的困惑/头痛。
【问题讨论】:
-
复合语句
result += 1;和result =+ 1;是正常赋值。 -
我认为新手应该学习如何编写单元测试,这样可以快速检测到此类错误。 :)
-
老实说,新手可能会做错什么不应该成为语言规范的基础。
-
它已经在stackoverflow.com/questions/2624410/…得到了很好的回答,请看一下。