编程的最后一天,我错误地写了这样的东西 -
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);
给出以下错误 -
错误:意外类型
答案 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;
这里的行为与第一种情况相同,因为+j
或i+
不是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++)+j
,i+ ++j
等同于i + (++j)
。
希望这增加了这有助于增加您的理解。
答案 3 :(得分:1)
运算符优先级只是答案的一半,因为要澄清的第一件事是代码中的运算符是什么。
基本上 i+++j
可以解释为i ++ + j
,i + ++ j
或i + + + 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));
相同(-j
是j
上的一元减号操作),它也提供5(并且也不会修改i
或j
)
什么是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+ ++j
是i + ++j
,++j
更改,'j = 4'。所以i[2] + j[4] = 6
。
Java可能无法识别三个+++
。