5

我已经对评估顺序进行了大量研究 - 但无法弄清楚这个方程的结果如何:

z = !x + y * z / 4 % 2 - 1

我最好的猜测是(从左到右):

z = !x + {[([y * z] / 4) % 2] - 1}
4

2 回答 2

7

评估顺序和运算符优先级是两个不同的东西。

你最好的猜测是正确的。所有乘法运算符* / %具有相同的优先级,并且从左到右绑定。加法运算符-的优先级较低。一元运算!符比乘法或加法运算符绑定得更紧密。并且赋值运算符的=优先级很低(但仍高于逗号运算符)。

所以这:

z = !x + y * z / 4 % 2 - 1

相当于:

z = (!x) + (((y * z) / 4) % 2) - 1

但是操作数可以按任何顺序合法地求值(除了某些运算符,如&&, ||, ,,它们强制从左到右求值)。如果操作数是简单的变量,这可能无关紧要,但类似于:

z = func(x) * func(y);

这两个函数调用可以按任意顺序发生。

于 2013-03-06T23:06:50.370 回答
1

看不懂就改写表情

z = !x + y * z / 4 % 2 - 1

notx = !x;         /* you can move this line 1, 2, or 3 lines down */
tmp1 = y * z;
tmp2 = tmp1 / 4;
tmp3 = tmp2 % 2;
tmp4 = notx + tmp3;
tmp5 = tmp4 - 1;
于 2013-03-06T23:08:08.353 回答