-2

问题是:

int z, x=5, y=-10 ,a=4, b=2;
z = x++ - --y * b / a;

只是想知道输出以及 --y 将如何处理“y”的负值。解决这个问题的优先级是什么?

4

5 回答 5

2

它将根据运算符优先级或“操作顺序”进行评估 - http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

于 2012-09-14T18:59:23.523 回答
2
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 保留它的值,因为在后缀表示法中,运算符返回原始值而不是修改后的值。(其他人链接了运算符优先级页面,所以我不会)

于 2012-09-14T19:04:06.587 回答
1

根据操作顺序,这两个是等价的

z = x++ - --y * b / a; 

z = (x++) - (((--y) * b) / a); 
于 2012-09-14T19:03:57.583 回答
1

操作的优先级

z = ((x++) - (((--y) * b) / a));

爱荷华州,

  1. --y计算前必须知道结果--y * b
  2. 的结果--y * b必须在计算之前知道--y * b / a*并且/具有相同的优先级,但是是左关联的,因此a / b * c将被解析为(a / b) * c);
  3. x++计算前必须知道结果x++ - --y * b / a
  4. 最后,在x++ - --y * b / a将结果分配给 之前,必须知道 的结果z

然而...

请注意,优先级评估顺序不同。每个单独的表达式x++, --y,ba都可以按任何顺序进行计算。编译器可以选择计算x++, then a, then b, then --y。编译器可以选择在评估--y * b / a之前先评估x++。编译器可以选择将副作用应用推迟到x++结果--y分配给z.

于 2012-09-14T20:33:32.407 回答
0

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。那是因为在++之后iy所以它们在=语句之后递增。

知道了这一点,只需应用您的正常操作顺序 (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。请记住,当乘法和除法彼此相邻时,只需从左到右阅读。

于 2012-09-14T19:01:06.510 回答