C - 等式的评估顺序

时间:2013-03-06 23:03:37

标签: c equation operator-precedence

我已经对评估的顺序进行了大量的研究 - 但是无法弄清楚它是如何用于这个等式的:

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

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

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

2 个答案:

答案 0 :(得分:7)

评估顺序和运算符优先级是两回事。

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

所以这个:

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

相当于:

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

但是,操作数可以合法地以任何顺序进行评估(除了&&||,等特定运算符,这些运算符执行从左到右的评估。如果操作数是简单变量,这可能无关紧要,但是在:

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

两个函数调用可以按任何顺序进行。

答案 1 :(得分: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;