为什么= +不会导致编译错误?
在他们的代码中错误地使用了=+
而不是+=
,并且没有显示为编译错误。
这是因为
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 )将结果提升为int
types的值。否则,如果操作数是编译时types
Long
,Float
或Double
,则会进行拆箱转换( §5.1.8 )。否则,如果操作数是编译时types
byte
,short
或char
,则通过扩展原语转换( §5.1.2 )将其提升为int
types的值。否则,一个一元数字操作数保持不变,不被转换。
无论如何,值集转换( §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是很奇怪的。