在下面的代码中,结果是-6。为什么?
` int x = 5;
int y = 3;
int result = x++ - (--y + ++x) - y--;`
我认为首先计算括号内的值,然后按照从左到右的顺序计算括号外的值,但这样,结果就不会是-6。 我认为这是顺序:
数字 1 的值为 6,x 为 6
数字 2 中的值是 2,y 是 2
数字 3 的值为 6,x 为 7
数字 4 的值为 2,y 为 1
数字 5,6,7 的表达式是 6 - 8 - 2 = -4,不等于 -6;
就运算符优先级和运算符结合性而言
引用 C# 规范(ECMA-334,第 6 版,2022 年 6 月,§11.4.1):
表达式中的操作数是从左到右计算的。
这意味着您最初的假设不正确:“我认为首先,对括号内的内容进行了评估”。
在这种情况下,将首先评估
x++
;序列看起来像这样:
x++
被评估,返回 5,但在 x--y
,在 y++x
,返回 7(因为 x
是上一次操作中的 6)5
(来自步骤 1)。 -
9
(来自步骤 4)= -4
y--
被评估,返回 2,但在 y-4
(来自步骤 5)。-
2
(来自步骤 6)= -6
正如其中一条评论中提到的(优先级、关联性、顺序),区分以下各项非常重要:
优先级规则描述了当表达式混合不同类型的运算符时,下括号表达式应如何加上括号
关联性规则描述了当表达式具有一堆相同类型的运算符时,应如何为带下括号的表达式添加括号
求值顺序规则描述了表达式中每个操作数的求值顺序