Java多个连续运算符

时间:2014-08-07 14:34:20

标签: java operators

注意:我偶然遇到过这种情况,所以可能不太实际,但我只是很好奇)

我希望在递增第二个值后打印出一个值,即两个值的总和。像这样:

int first = 10;
int second = 20;
System.out.println(first + ++second);  //31
System.out.println(first);             //10
System.out.println(second);            //21

也许不是最新的代码,但它有效。但后来,我开始尝试。

System.out.println(first +++ second);  //30
System.out.println(first);             //11
System.out.println(second);            //21

那很好;它意味着第一个在添加后增加,并且这里可以忽略空格。凉。但是......然后......

System.out.println(first +++++ second);  //"Invalid Argument", doesn't work

虽然

System.out.println(first ++ + ++ second);  //31
System.out.println(first);             //11
System.out.println(second);            //21

工作正常,但由于某种原因,仍然不同于

System.out.println(first + + + ++ second);  //31
System.out.println(first);             //10
System.out.println(second);            //21

也许是最奇怪的,

System.out.println(first + + + + + + second);  //30
System.out.println(first);             //10
System.out.println(second);            //20

那么这里发生了什么?何时忽略运算符之间的空格,何时不是?为什么我可以写#34; + + + + +",没有任何问题?

谢谢!

3 个答案:

答案 0 :(得分:8)

这归结为operator precedence。操作顺序如下:

  • postfix(foo++foo--
  • 一元(++foo--foo+expr,...)
  • ...
  • 添加剂(+-
  • ...

那么,让我们来看看每个表达式:

first + ++secondfirst + (++second)。没关系。

first +++ second(first++) + second,按照您的说法运作。

first +++++ second((first ++)++)+ second),但(first ++)是一个值(不是变量),因此无法递增 - 这就是错误试图告诉您的内容。

first ++ + ++ second明确告诉Java以不同于上面的方式进行拆分:它变为(first ++) + (++ second),这很好。

first + + + + + + second变为first + (+ (+ (+ (+ (+ second)))))。一元+只是意味着“没有否定”,所以+foo == foo。因此,这个表达式简化为first + second,这显然很好。

答案 1 :(得分:2)

我不想将其作为副本关闭,因为它是一种不同的语言,但我认为这与列出here的原因相同。

这只是一个解析问题,这些子弹应该可以帮助你解决这个问题:

  • Java允许很多的空白
  • +这样的连续数学运算符没有任何额外的含义,只会应用一个
  • 从左到右进行解析

代码:first +++ second
解析:first++ + second

代码:first +++++ second
解析:没有二元运算符++,因为它会尝试生成++ ++ +

代码:first ++ + ++ second
解析:first++ + ++second

代码:first + + + ++ second
解析:first + ++second

代码:first + + + + + + second
解析:first + second

答案 2 :(得分:0)

我认为解析器是贪婪的,即它总是吃尽可能多的加号,如果可能的话,将它们减少到增量运算符。

即。它从左到右,当它发现两个后续的加号时,它将它们作为增量运算符进行计算,而单个加号后跟一个非加号则被视为二进制加或一元加,取决于左侧操作数。