问题是:
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
只是想知道输出以及 --y 将如何处理“y”的负值。解决这个问题的优先级是什么?
问题是:
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
只是想知道输出以及 --y 将如何处理“y”的负值。解决这个问题的优先级是什么?
它将根据运算符优先级或“操作顺序”进行评估 - http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
z = 5++ - --(-10) * 2 / 4 // Suffix ++/-- goes first
z = 5 - --(-10) * 2 / 4 // Prefix ++/-- is next
z = 5 - (-11) * 2 / 4 // and then * and /
z = 5 - (-22) / 4
z = 5 - (-5)
z = 10
与 y 不同,x 保留它的值,因为在后缀表示法中,运算符返回原始值而不是修改后的值。(其他人链接了运算符优先级页面,所以我不会)
z = x++ - --y * b / a;
z = (x++) - (((--y) * b) / a);
操作的优先级是
z = ((x++) - (((--y) * b) / a));
爱荷华州,
--y
计算前必须知道结果--y * b
;--y * b
必须在计算之前知道--y * b / a
(*
并且/
具有相同的优先级,但是是左关联的,因此a / b * c
将被解析为(a / b) * c
);x++
计算前必须知道结果x++ - --y * b / a
x++ - --y * b / a
将结果分配给 之前,必须知道 的结果z
。然而...
请注意,优先级与评估顺序不同。每个单独的表达式x++
, --y
,b
和a
都可以按任何顺序进行计算。编译器可以选择计算x++
, then a
, then b
, then --y
。编译器可以选择在评估--y * b / a
之前先评估x++
。编译器可以选择将副作用应用推迟到x++
结果--y
分配给z
.
y
将在=
操作--
之前递减y
,
因为在.x
=
++
x
例如:
int i = 2, y = 3, z;
z = ++i + ++y; //3 + 4
或者
int i = 2, y = 3, z;
z = --i + --y; //1 + 2
和
int i = 2, y = 3, z;
z = i++ + y++; //2 + 3
请注意,在最后一个示例中,它仍然是 2 + 3。那是因为在++
之后i
,y
所以它们在=
语句之后递增。
知道了这一点,只需应用您的正常操作顺序
(1. Parentheses 2. Exponents 3. Multiplication/Divison 4. Addition/Subtraction)
来解决问题。由于乘法和除法段彼此相邻,因此只需从左到右读取该部分。
int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;
y = --y
y = -11
z = 5 - -11 * 2 / 4
z = 5 - -22 / 4
z = 5 - -5
z = 10
x = 5++
x = 6
这是我对此的思考过程:我根据x
andy
的位置来解释++
and的值--
,然后首先乘以该值,然后-y * b
将该值除以,a
然后将该值添加到x
,最后递增x
。请记住,当乘法和除法彼此相邻时,只需从左到右阅读。