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

时间:2014-12-09 03:43:50

标签: java operators

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

这是因为

int a =+ 2;

相同
int a = 0 + 2;

2 个答案:

答案 0 :(得分:104)

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

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

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

  
      
  • 如果操作数是编译时类型ByteShortCharacterInteger,则会进行拆箱转换   (§5.1.8)。   然后通过扩展将结果提升为类型int的值   原始转换   (§5.1.2)   或身份转换   (§5.1.1)。

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

  •   
  • 否则,如果操作数是编译时类型byteshortchar,则会将其提升为类型int的值扩大   原始转换   (§5.1.2)。

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

  •   
     

无论如何,价值集转换   (§5.1.13)   然后应用。

简而言之,这意味着

  1. 数字原始包装类型为未装箱和;
  2. 小于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;是一个初始化,而不是一个赋值,对于程序员来说,考虑增加一个仅仅是现在的变量是一件很奇怪的事情。鉴于其初始值。