不明确的运算符优先级,请解释为什么运算符在这里没有遵循?

pho*_*nix 4 c

x = y = z = 1;
z = ++x||++y&&++z;
Run Code Online (Sandbox Code Playgroud)

运算符优先级如下 -

(pre-increment) > && > ||
Run Code Online (Sandbox Code Playgroud)

所以回答应该是 -

1.  2||2 && 2
2.  2||1
3.  1

print x,y,z should be 2,2,1
Run Code Online (Sandbox Code Playgroud)

但是,答案是2,1,1.

ver*_*ose 12

优先顺序与评估顺序不同.优先级简单地确定操作数和运算符属于一起.除了逻辑运算符之外,没有指定评估的确切顺序,逻辑运算符以严格的从左到右的顺序进行评估以启用短路.

因此&&具有更高的优先级,变量首先分组如下:

(++x) || (++y && ++z)
Run Code Online (Sandbox Code Playgroud)

然后,按照从左到右的顺序++x进行评估.鉴于这++x是真的,众所周知,整个表达式都是正确的.所以表达评估是短路的. (++y && ++z)永远不会被评估.因此y和z永远不会增加.

  • 你可能想澄清一下,除了短路运算符`||'和`&&`之外,没有指定评估的确切顺序,在这种情况下,它是严格从左到右的. (2认同)

das*_*ght 8

表达式与逻辑运算符&&||从左到右评估:

C99,第6.5.14-4节与按位运算|符不同,运算||符保证从左到右的评估; 在评估第一个操作数后有一个序列点.如果第一个操作数与不相等0,则不计算第二个操作数.

由于x++不是零,表达式将对所有内容的评估短路||,包括它们的副作用.这就是为什么只x++评估,所以x成为2.其余变量保持不变1.