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

在他们的代码中错误地使用了=+而不是+= ,并且没有显示为编译错误。

这是因为

 int a =+ 2; 

是相同的

 int a = 0 + 2; 

没有编译错误,因为+是一个有效的(虽然相当无用的) 一元运算符 ,其方式是:

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

Java语言规范中的相关部分是Unary Plus Operator +(第15.15.3节) 。 它指定调用一元+操作导致操作数的一元数字升级(第5.6.1节) 。 这意味着:

  • 如果操作数是编译时types的ByteShortCharacterInteger ,则它将经历拆箱转换( §5.1.8 )。 然后通过扩展原语转换( §5.1.2 )或标识转换( §5.1.1 )将结果提升为inttypes的值。

  • 否则,如果操作数是编译时typesLongFloatDouble ,则会进行拆箱转换( §5.1.8 )。

  • 否则,如果操作数是编译时typesbyteshortchar ,则通过扩展原语转换( §5.1.2 )将其提升为inttypes的值。

  • 否则,一个一元数字操作数保持不变,不被转换。

无论如何,值集转换( §5.1.13 )将被应用。

总之,这就是说

  1. 数字原始包装types被拆箱 ,并;
  2. 小于int整数types被加宽int

这里可能存在一个bug。 作者可能打算写a += 2;

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

然后,他们开始明白了,并开始给出op=可能意图的警告,现在不再接受=op了。

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

另一方面, = in int x =+ 2; 是一个初始化,而不是一个赋值,对程序员来说,增加一个刚刚被赋予初始值的variables是很奇怪的。