我已经对评估顺序进行了大量研究 - 但无法弄清楚这个方程的结果如何:
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 = !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;