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。
一元 + 运算符不是空运算。
如果参数的 type 是 char
、byte
或 short
,则应用一元 + 后的结果类型是一个 int
.
这允许你写
char arg = 0;
int foo = +arg;
考虑以下 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。
一元 + 运算符不是空运算。
如果参数的 type 是 char
、byte
或 short
,则应用一元 + 后的结果类型是一个 int
.
这允许你写
char arg = 0;
int foo = +arg;