遇到某人错误地在他们的代码中使用=+
而不是+=
并且它没有显示为编译错误。
这是因为
int a =+ 2;
与
相同int a = 0 + 2;
答案 0 :(得分:104)
没有编译错误,因为+
是一个有效的(尽管相当无用的)一元运算符,其方式与-
相同:
int x = +1;
int y = -1;
Java语言规范中的相关部分是Unary Plus Operator + (§15.15.3 )。它指定调用一元+
操作会导致操作数的Unary Numeric Promotion (§5.6.1)。这意味着:
如果操作数是编译时类型
Byte
,Short
,Character
或Integer
,则会进行拆箱转换 (§5.1.8)。 然后通过扩展将结果提升为类型int
的值 原始转换 (§5.1.2) 或身份转换 (§5.1.1)。否则,如果操作数是编译时类型
Long
,Float
或Double
,则会进行拆箱转换 (§5.1.8)。否则,如果操作数是编译时类型
byte
,short
或char
,则会将其提升为类型int
的值扩大 原始转换 (§5.1.2)。否则,一元数字操作数保持不变,不会被转换。
无论如何,价值集转换 (§5.1.13) 然后应用。
简而言之,这意味着
int
的整数类型加宽至int
。答案 1 :(得分:35)
这里可能存在潜伏的错误。作者可能打算写a += 2;
在原始版本的C中,a += 2;
和a =+ 2;
是同义词。如果您的意思是a = +2;
,则必须小心在=
和+
之间留出空格。与所有其他运营商相同。 a=*p;
乘以a乘以p。 a = *p;
取消引用指针p并将结果分配给。
然后他们醒悟过来,并开始警告=op
op=
可能在哪里,现在根本不再接受=op
。
但是旧习惯很难改变。一个老派的C程序员可能仍然心不在焉地使用旧式语法,即使用C语言写作也是如此。
另一方面,=
中的int x =+ 2;
是一个初始化,而不是一个赋值,对于程序员来说,考虑增加一个仅仅是现在的变量是一件很奇怪的事情。鉴于其初始值。