(注意:我偶然遇到过这种情况,所以可能不太实际,但我只是很好奇)
我希望在递增第二个值后打印出一个值,即两个值的总和。像这样:
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; + + + + +",没有任何问题?
谢谢!
答案 0 :(得分:8)
这归结为operator precedence。操作顺序如下:
foo++
,foo--
)++foo
,--foo
,+expr
,...)+
,-
)那么,让我们来看看每个表达式:
first + ++second
是first + (++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的原因相同。
这只是一个解析问题,这些子弹应该可以帮助你解决这个问题:
+
这样的连续数学运算符没有任何额外的含义,只会应用一个代码:first +++ second
解析:first++ + second
代码:first +++++ second
解析:没有二元运算符++
,因为它会尝试生成++ ++ +
代码:first ++ + ++ second
解析:first++ + ++second
代码:first + + + ++ second
解析:first + ++second
代码:first + + + + + + second
解析:first + second
答案 2 :(得分:0)
我认为解析器是贪婪的,即它总是吃尽可能多的加号,如果可能的话,将它们减少到增量运算符。
即。它从左到右,当它发现两个后续的加号时,它将它们作为增量运算符进行计算,而单个加号后跟一个非加号则被视为二进制加或一元加,取决于左侧操作数。