为什么= +不会导致编译错误?
在他们的代码中错误地使用了=+而不是+= ,并且没有显示为编译错误。
这是因为
int a =+ 2;
是相同的
int a = 0 + 2;
?
没有编译错误,因为+是一个有效的(虽然相当无用的) 一元运算符 ,其方式是:
int x = +1; int y = -1;
Java语言规范中的相关部分是Unary Plus Operator +(第15.15.3节) 。 它指定调用一元+操作导致操作数的一元数字升级(第5.6.1节) 。 这意味着:
如果操作数是编译时types的
Byte,Short,Character或Integer,则它将经历拆箱转换( §5.1.8 )。 然后通过扩展原语转换( §5.1.2 )或标识转换( §5.1.1 )将结果提升为inttypes的值。否则,如果操作数是编译时types
Long,Float或Double,则会进行拆箱转换( §5.1.8 )。否则,如果操作数是编译时types
byte,short或char,则通过扩展原语转换( §5.1.2 )将其提升为inttypes的值。否则,一个一元数字操作数保持不变,不被转换。
无论如何,值集转换( §5.1.13 )将被应用。
总之,这就是说
- 数字原始包装types被拆箱 ,并;
- 小于
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是很奇怪的。