[英]Confusion using Increment and decrement operators in Java
我有一个带有增量和减量运算符以及一些二进制运算符的表达式。
public class precedence {
public static void main(String ar[]){
int a=3;
int b=4;
System.out.println(a++ * b-- / a-- + ++b);
System.out.println(a+","+b);
}
}
首先++ b替换为5,b将变为5。
然后,由于所有其余术语均为修订后版本,因此评估顺序为从右到左
将a--替换为3,并将a更改为2。
b--将被5代替,b变为4。
a ++将替换为2,而a变为3。
因此,最终表达式应为2 * 5/3 + 5,等于8,但输出中显示的答案是7。有人可以告诉我我错了吗。
首先,如果您有以下内容:
A * B / C + D
根据Java Language Spec, section 15.7, Evaluation order
该表达式从左到右进行评估,因为没有优先级,括号或关联性会覆盖该顺序。
Java编程语言保证运算符的操作数似乎按照特定的评估顺序(即从左到右)进行评估。
JLS section 15.7.3
可以覆盖此正常顺序:
Java编程语言遵守括号中显式表示的评估顺序,并且运算符优先级隐式表示评估顺序。
但这不是事实,因为除法和乘法的优先级高于加法,并且不包含括号。
另外,15.7.1明确指出(我强调):
在评估右侧操作数的任何部分之前,似乎已对二进制运算符的左侧操作数进行了完全评估。
因此,副作用属于子表达式评估, 而不是整个表达式。 这意味着,在a * --a
之类的值中,减小a
不可能影响已经被充分评估的乘法的左侧。
因此,在上面显示的表达式中, A * B / C + D
, D
实际上将最后被求值,并且附加到它的任何副作用都不会在其他所有值都被求值之前发生。 此外,在对D
进行操作之前,会因A
, B
或C
的评估而产生任何副作用。
将该推理应用于您的副作用表达,实际上是:
(a++) * (b--) / (a--) + (++b)
a
是3
, b
是4
。 a++
使用3
,将a
设置为4
。 b--
使用4
,将b
设置为3
。 a--
使用4
,将a
设置为3
。 ++b
组b
至4
,使用4
。 所以:
3 * 4 / 4 + 4
= 12 / 4 + 4
= 3 + 4
= 7
让我们关注有关声明
int a=3; int b=4;
System.out.println(a++ * b-- / a-- + ++b);
步骤1: (
a++
* b-- / a-- + ++b)
至(
3
* b-- / a-- + ++b)
a=4,b=4
步骤2: (a++ *
b--
/ a-- + ++b)
至(3 *
4
/ a-- + ++b)
a=4,b=3
步骤3: (a++ * b-- /
a--
+ ++b)
至(3 * 4 /
4
+ ++b)
a=3,b=3
步骤4: (a++ * b-- / a-- +
++b
)
到(3 * 4 / 4 +
(a++ * b-- / a-- +
(3 * 4 / 4 +
4
)
a=3,b=4
所以最终的表达式是(3 * 4 / 4 + 4)
希望这可以澄清:)
int a=3;
int b=4;
System.out.println(a++ * b-- / a-- + ++b);
System.out.println(a+","+b);
您在语句中使用以下运算符。 运算符按其优先顺序列出。
因此a++
(3, a=4)
, b--
(4, b=3)
和a--
(4, a=3)
将按照从左到右的顺序执行。 然后将执行++b
(4, b=4)
。 现在, 乘法运算符将按从左到右的顺序执行。 因此(3 * 4/4 + 4)。
(3 * 4 / 4 + 4) ==> (12 / 4 + 4) ==> (3 + 4) ==> 7
因此输出为:7 。
最终值a = 3和b = 4 。
编辑:在评论中提问。
a=3,b=4;
expression : ++b * --a + ++b;
++b
(5)
,-- --a
(2)
和++b
(6)
将按从左到右的顺序执行。
现在表达式是(5 * 2 + 6)
==> (10 + 6)
==> (16)
。
您可以检查与此相关的帖子。 我已经引用了。 链接 。
System.out.println(a++ * b-- / a-- + ++b);
System.out.println(3 * 4 / 4 + 4);
您必须像这样阅读它:每当看到变量时,它都会被返回。 因此,如果您有a++
,它将首先返回它,然后递增它。 如果您使用++a
,它将首先对其进行递增,然后将其返回。
嗨,它遵循“ bodmas”
B支架优先
O阶(即幂和平方根等)
DM除法和乘法(从左到右)
AS加减法(从左到右)
int a=3;
int b=4;
System.out.println(a++ * b-- / a-- + ++b);
a++ * b-- / a-- + ++b
3*(4/4) +4
3*1 +4
3 +4
a ++ * b-- / a-- + ++ b = 3 * 4/4 + 4
现在应用DMAS规则,因此3 * 1 + 4 = 3 + 4 = 7
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.