【问题标题】:Java: why is explicit positive numbers even allowed? [duplicate]Java:为什么甚至允许显式正数? [复制]
【发布时间】: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/…得到了很好的回答,请看一下。

标签: java operators


【解决方案1】:

一元 + 运算符不是无操作。

如果参数的类型charbyteshort,则应用一元+后的结果类型为int

这可以让你写

char arg = 0;
int foo = +arg;

【讨论】:

  • 谢谢,这是有道理的。但是,在上述类型实际上是 int 的情况下,它没有意义。类型检查器是否有可能发现参数确实是一个 int 并在显式添加 '+' 时产生错误?
猜你喜欢
  • 2018-10-22
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2018-09-10
  • 2018-05-09
  • 2017-10-08
  • 2018-10-04
相关资源
最近更新 更多