C - 等式的评估顺序

sna*_*121 5 c equation operator-precedence

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

z = !x + y * z / 4 % 2 - 1
Run Code Online (Sandbox Code Playgroud)

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

z = !x + {[([y * z] / 4) % 2] - 1}
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 8

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

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

所以这:

z = !x + y * z / 4 % 2 - 1
Run Code Online (Sandbox Code Playgroud)

相当于:

z = (!x) + (((y * z) / 4) % 2) - 1
Run Code Online (Sandbox Code Playgroud)

但是,操作数可以依法进行评估以任意顺序(除了某些运营商一样&&,||,,,其征收左到右的评价).如果操作数是简单变量,这可能无关紧要,但是类似于:

z = func(x) * func(y);
Run Code Online (Sandbox Code Playgroud)

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