Java: +--i 和 +++i 的区别

Java: Difference between +--i and +++i

最后一天在编程的时候,误写了这样的东西-

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+--ja = i+ --j 之间没有区别。两者都给出-

a = 4

这是为什么?我完全理解这里到底发生了什么。我不明白的是- 'WHY?'+-都是运算符,为什么会有区别?


为了清楚起见,我想分享另一个奇怪的经历。此代码完美运行-

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

并输出-

value: -1

但是这个-

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

给出以下错误-

error: unexpected type

可能i+++j只是i+j,而i+ ++ji + ++j++j变了,'j=4'。所以 i[2] + j[4] = 6.

Java可能认不出三个+++.

正如@Bunti 所指出的,您的答案在 Operator Precedence.

当你这样做时,

int a = i+++j;

它被评估为 int a = (i++) + j 因为 Postfix 具有最高的优先级。 现在您知道为什么会出现 a = 5 了。 打印 ia,您会看到它增加了。

同样,当您执行 System.out.println("value: "+++i); 时,它的计算结果为 System.out.println(("value: "++) + i);

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

但是当你这样做时,System.out.println("value: "+--i);,它被评估为 System.out.println("value: "+ (--i));。因此它工作得很好。

希望这能回答算术运算的行为-

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

a=5 因为 + 符号之间没有 space。即使您在两者之间放置更多 + 个符号,答案也将保持不变。为了解释它的工作原理,它类似于我们使用的任何基本计算器,如果我输入一个数字并键入 + 任意次数,收到的第二个输入仍然会给出 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 个 diff 算术运算符,即 +--。由于定义了 --j 值会减少,j 的变化值会添加到 i

int a = i+ --j;

和上面一样,因为+-是diff操作。他们之间的space不重要。

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

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

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

为此,打印函数中的 + 被定义为提供一种打印由 + 符号分隔的多个变量的方法,因此 +++ 的合取是未为打印功能定义,因此会出错。

他们中的许多人为此写了答案。我想用不同的词来表达。

i++ 是 post 修复。

在post固定操作中,值在提取后递增。

因此,在 i+++j 的情况下,我们在计算表达式时得到 i 的原始值,并且 i 在计算完成后递增。

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

这个i+++j等于(i++)+ji+ ++j等于i + (++j)

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

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

基本上 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)); 相同(+jj 上的一元加运算),所以这再次给出 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".