方程的求值阶



我已经做了大量的研究如何评估的顺序-但不能弄清楚它将如何为这个方程:

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

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

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

求值顺序和操作符优先级是两码事。

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

:

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

等价于:

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

但是操作数可以合法地按任何顺序求值(&&||,等特定操作符强制从左到右求值除外)。如果操作数是简单的变量,这可能无关紧要,但在以下情况中:

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

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

如果你不能理解,重写你的表达式

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;

最新更新