Java多个连续运算符

She*_*erz 5 java operators

(注意:我偶然发现了这个,所以它可能不太实用,但我只是很好奇)

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

int first = 10;
int second = 20;
System.out.println(first + ++second);  //31
System.out.println(first);             //10
System.out.println(second);            //21
Run Code Online (Sandbox Code Playgroud)

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

System.out.println(first +++ second);  //30
System.out.println(first);             //11
System.out.println(second);            //21
Run Code Online (Sandbox Code Playgroud)

没关系; 它意味着第一个在添加后增加,并且这里可以忽略空格.凉.但是之后...

System.out.println(first +++++ second);  //"Invalid Argument", doesn't work
Run Code Online (Sandbox Code Playgroud)

System.out.println(first ++ + ++ second);  //31
System.out.println(first);             //11
System.out.println(second);            //21
Run Code Online (Sandbox Code Playgroud)

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

System.out.println(first + + + ++ second);  //31
System.out.println(first);             //10
System.out.println(second);            //21
Run Code Online (Sandbox Code Playgroud)

也许是最奇怪的,

System.out.println(first + + + + + + second);  //30
System.out.println(first);             //10
System.out.println(second);            //20
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

ysh*_*vit 9

这归结为运营商优先权.操作顺序如下:

  • 后缀(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,显然很好.

  • 哦,一个积极的一元运算符.不知道存在.其他一切都很有意义.干杯! (3认同)
  • Ya,woops,我的坏,我会为后人解决这个问题. (2认同)