问题是:
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 / ax++ - --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
这是我对此的思考过程:我根据xandy的位置来解释++and的值--,然后首先乘以该值,然后-y * b将该值除以,a然后将该值添加到x,最后递增x。请记住,当乘法和除法彼此相邻时,只需从左到右阅读。