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+--j
和 a = 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+ ++j
是i + ++j
,++j
变了,'j=4'。所以 i[2] + j[4] = 6
.
Java可能认不出三个+++
.
正如@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));
。因此它工作得很好。
希望这能回答算术运算的行为-
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;
这里它的行为与第一种情况相同,因为 +j
或 i+
不是 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++)+j
,i+ ++j
等于i + (++j)
。
希望这有助于增加您的理解。
运算符优先级只是答案的一半,因为首先要澄清的是代码中的运算符是什么。
基本上 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".
最后一天在编程的时候,误写了这样的东西-
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
这是为什么?我完全理解这里到底发生了什么。我不明白的是- 'WHY?'。 +
和-
都是运算符,为什么会有区别?
为了清楚起见,我想分享另一个奇怪的经历。此代码完美运行-
int i=0;
System.out.println("value: "+--i);
并输出-
value: -1
但是这个-
System.out.println("value: "+++i);
给出以下错误-
error: unexpected type
可能i+++j
只是i+j
,而i+ ++j
是i + ++j
,++j
变了,'j=4'。所以 i[2] + j[4] = 6
.
Java可能认不出三个+++
.
正如@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));
。因此它工作得很好。
希望这能回答算术运算的行为-
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;
这里它的行为与第一种情况相同,因为 +j
或 i+
不是 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++)+j
,i+ ++j
等于i + (++j)
。
希望这有助于增加您的理解。
运算符优先级只是答案的一半,因为首先要澄清的是代码中的运算符是什么。
基本上 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".