我有一个带递增和递减运算符的表达式以及一些二元运算符。
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.有人可以告诉我哪里错了。
答案 0 :(得分:5)
首先,如果您有类似的内容:
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
实际上将被评估为 last ,并且在其他所有内容之前不会发生任何附加到其上的副作用已经评估过。此外,评估A
,B
或C
时产生的任何副作用都将在D
被采取行动之前发生。
将这种推理应用于您的副作用表达式,这是有效的:
(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
答案 1 :(得分:1)
让我们采取有关的声明
int a=3;
int b=4;
System.out.println(a++ * b-- / a-- + ++b);
第1步:(
a++
* b-- / a-- + ++b)
至(
3
{{1} }
* b-- / a-- + ++b)
第2步:a=4,b=4
(a++ *
b--
至/ a-- + ++b)
(3 *
{{1} }
4
第3步:/ a-- + ++b)
a=4,b=3
(a++ * b-- /
至a--
+ ++b)
{{1} }
(3 * 4 /
第4步:4
+ ++b)
a=3,b=3
至(a++ * b-- / a-- +
++b
{{1} }
)
所以最后的表达式是(3 * 4 / 4 +
希望这澄清:)
答案 2 :(得分:1)
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)
。
您可以查看与此相关的帖子。我引用了它。 Link
答案 3 :(得分:0)
System.out.println(a++ * b-- / a-- + ++b);
System.out.println(3 * 4 / 4 + 4);
你必须这样读:
每当您看到变量时,它都会被返回。
因此,如果您有a++
,它将首先返回它然后递增它。
如果你有++a
,它会先增加它然后再返回它。
答案 4 :(得分:0)
嗨接下来" 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
答案 5 :(得分:-1)
a ++ * b-- / a-- + ++ b = 3 * 4/4 + 4
现在应用DMAS规则,所以3 * 1 + 4 = 3 + 4 = 7