Java:+ - i和+++ i

时间:2016-03-14 04:25:18

标签: java operators operator-precedence

编程的最后一天,我错误地写了这样的东西 -

int i = 2;
int j = 3;
int a = i+++j;

它没有发现任何错误,我得到了 -

  

a = 5

但是当我稍微改变它时 -

int a = i+ ++j;

我得到了 -

  

a = 6

有了这个 -

int a = i+ + +j;

和 -

int a = i++ +j;

我又来了 -

  

a = 5

遇到类似情况here

但是这里出现了奇怪的部分。 a = i+--j&之间没有区别a = i+ --j。两者都给出了 -

  

a = 4

为什么? 我完全理解这里到底发生了什么。我不明白的是 - '为什么?' +-都是运营商,那么为什么会有差异呢?

为清楚起见,我希望分享另一个奇怪的经历。这段代码完美无缺 -

int i=0;
System.out.println("value: "+--i);

输出 -

  

值:-1

但是这个 -

System.out.println("value: "+++i);

给出以下错误 -

  

错误:意外类型

5 个答案:

答案 0 :(得分:2)

正如@Bunti指出的那样,你的答案在Operator Precedence

当你这样做时,

int a = i+++j;

它被评估为int a = (i++) + j,因为Postfix具有最高优先级。 现在你知道为什么你会在那里得到a = 5打印i以及a,您会看到它已递增。

同样,当您执行System.out.println("value: "+++i);时,会将其评估为System.out.println(("value: "++) + i);

但后缀操作不适用于String。因此语法错误。

但是,当您执行System.out.println("value: "+--i);时,会将其评估为System.out.println("value: "+ (--i));。因此它运作得很好。

答案 1 :(得分:1)

希望这能解决算术运算的行为 -

int i = 2;
int j = 3;
int a = i+++j;

a = 5,因为+符号之间没有空格。即使您在其间添加了更多+符号,答案也将保持不变。为了解释它的工作原理,它类似于我们使用的任何基本计算器,如果我输入一个数字并输入+任意次,输入时的第二个输入仍将给出2个输入数字的总和。这是因为编译器正在初始化2个数字之间的加法运算。

int a = i+ ++j;

在这种情况下,您要将i添加到j的递增值。所以就像你正在寻找2+ ++3的操作,2+4,因此答案是6++运算符定义为 JRE 中的增量。

int a = i+ + +j; 

这里的行为与第一种情况相同,因为+ji+不是JRE定义的增量运算符。

int a = i+--j; 

在这个有趣的案例中,我们使用了2个差分算术运算符,即+--。在定义--时,会发生j值的减量,并将j的更改值添加到i

int a = i+ --j;

如上所述,因为+-是差异操作。它们之间的空间与否并不重要。

int i=0;
System.out.println("value: "+--i);

在这种情况下,我们打印一个字符串并使用+--i;所以 JRE 将其视为打印输出值:递减i。如print语句中所知,+用于使系统一次打印多个值。

System.out.println("value: "+++i); 

到此为止,定义了打印函数中的+以提供一种打印由+符号分隔的多个变量的方法,因此未定义+++的连接用于打印功能,因此会出错。

答案 2 :(得分:1)

他们中的许多人都为此写了答案。我想用不同的话来说。

i++是修补后的。

在后期修复操作中,在提取值后,值会递增。

因此,在i+++j的情况下,我们在评估表达式时具有i的原始值,并且在评估完成后i递增。

++j的情况下,因为它的前缀值在评估之前递增。

i+++j等于(i++)+ji+ ++j等同于i + (++j)

希望这增加了这有助于增加您的理解。

答案 3 :(得分:1)

运算符优先级只是答案的一半,因为要澄清的第一件事是代码中的运算符是什么。

基本上 i+++j可以解释为i ++ + ji + ++ ji + + + j

然而根据Java的词法规则(https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.2),解释与表达式写成i ++ + j的解释相同。

根据运算符优先级,评估结果为(i++) + j,因此int a = i++ + j; a中的值为5(而i为3!)。

对于i+--j,令牌为i + -- j(因为不是运算符+-),这取决于运算符优先级i + (--j),因此int a = i + --j; a为4(而j现为2)。

现在来了有趣的部分:

什么是int a = i + + + j;?这与int a = i + (+(+j));+j上的j是一元加上操作)相同,因此再次给出5(但i仍为2和j仍然是3,这与案例i++ + j不同!)

什么是int a = i + - - j;?这与int a = i + (-(-j));相同(-jj上的一元减号操作),它也提供5(并且也不会修改ij

什么是int a = i++++j;?这不是一个有效的Java表达式(它不会编译),因为这相当于(i++) ++ j,因为i++无法转换为变量,这是非法的(https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.14.2)然后那里这也是悬空j

添加更多+而不添加空格并不合法,而i++ + ++j完全合法......

同样,"SomeString"+++i是非法的,因为它被读作("SomeString"++)+i,你不能增加一个字符串文字(也不是一个字符串变量)。

"SomeString"+--i有效,因为它被视为"SomeString"+(--i),会将--i的结果附加到" SomeString"。

答案 4 :(得分:0)

可能i+++j只是i+j,但i+ ++ji + ++j++j更改,'j = 4'。所以i[2] + j[4] = 6

Java可能无法识别三个+++