我已经对评估的顺序进行了大量的研究 - 但是无法弄清楚它是如何用于这个等式的:
z = !x + y * z / 4 % 2 - 1
我最好的猜测是(从左到右):
z = !x + {[([y * z] / 4) % 2] - 1}
答案 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;