为什么 =+ 不会导致编译错误?

2022-09-01 04:45:04

遇到有人错误地在他们的代码中使用而不是,它没有显示为编译错误。=++=

这是因为

int a =+ 2;

与 相同

int a = 0 + 2;

?


答案 1

没有编译错误,因为 是一个有效的(尽管相当无用的)一元运算符,其方式与以下方式相同:+-

int x = +1;
int y = -1;

Java 语言规范中的相关部分是一元加运算符 + (§15.15.3 )。它指定调用一元运算会导致一元数字提升 (§5.6.1) 的操作数。这意味着:+

  • 如果操作数是编译时类型 、 、 或 ,则需进行拆箱转换 (§5.1.8)。然后,通过加宽基元转换 (§5.1.2) 或标识转换 (§5.1.1) 将结果提升为类型值。ByteShortCharacterIntegerint

  • 否则,如果操作数是编译时类型 、或 ,则将对其进行取消装箱转换 (§5.1.8)。LongFloatDouble

  • 否则,如果操作数是编译时类型 、 或 ,则通过加宽基元转换将其提升为类型的值 (§5.1.2)。byteshortcharint

  • 否则,一元数字操作数将保持原样,并且不会进行转换。

在任何情况下,都会应用值集转换 (§5.1.13)。

简而言之,这意味着

  1. 数字基元包装器类型是无框的,并且;
  2. 小于 的整数类型将加宽为 。intint

答案 2

这里可能潜伏着一个错误。作者可能打算写a += 2;

在C的原始版本中,并且是同义词。如果你的意思是,你必须小心地在 和 之间留出一个空格。与所有其他运算符相同。 将 a 乘以 p。 取消引用指针 p 并将结果分配给 a。a += 2;a =+ 2;a = +2;=+a=*p;a = *p;

然后他们醒悟过来,开始警告他们可能打算去哪里,现在不再接受。=opop==op

但旧习惯很难改掉。一个老派的C程序员可能仍然会心不在焉地使用老派的语法,即使用C以外的语言编写也是如此。

另一方面,in是一个初始化,而不是赋值,对于程序员来说,从递增一个刚刚被赋予其初始值的变量的角度来看待是很奇怪的。=int x =+ 2;