Java:为什么允许明确的正数?

Java: why is explicit positive numbers even allowed?

考虑以下 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 允许运算符和操作数之间的任意空格(包括 空格)以及显式指定的能力引起的一个数字是正数(如 result = +1;)。

允许任意空格似乎是有益的,因为您可以按照自己的喜好构建代码。 但是,允许显式正数有什么好处?显然(幸运的是)它 不会 将已经为负数的数字变成正数:

int value = -42;
value = +value;
// value is still -42.

这里一定有一些我遗漏的东西,保证新手可能会因为这个设计决定而体验到额外的 confusion/headaches。

一元 + 运算符不是空运算。

如果参数的 typecharbyteshort,则应用一元 + 后的结果类型是一个 int.

这允许你写

char arg = 0;
int foo = +arg;