是'if'条件中忽略运算符的优先级

bug*_*ger 7 c operator-precedence

我是以下代码:

void main()
{
  int k, x, y, z;
  printf("\nExperiment 1:");
  x = 0, y = 0, z = 0;
  k = x++ || y++ && z++;
  printf("\nx = %d, y = %d, z = %d and k = %d\n", x, y, z, k);
  printf("\nExperiment 2:");
  x = 1, y = 0, z = 0;
  k = x++ || y++ && z++;
  printf("\nx = %d, y = %d, z = %d and k = %d\n", x, y, z, k);
}
Run Code Online (Sandbox Code Playgroud)

输出:

实验1:x = 1,y = 1,z = 0且k = 0

实验2:x = 2,y = 0,z = 0且k = 1

我所理解的是:为了使表达成立,"||"的左侧或右侧 必须是非零的.它从左边开始.如果left不为零,则不会进一步评估.如果它为零,则从右侧开始.在右边我们有'&&'.所以,我们再次从&&的左侧开始,如果它为零,表达式不能为真,并且不会继续.否则它会评估'&&'的右侧

我的假设是operator &&具有更高的优先级.所以,它的两个参数都应该被评估,然后应该在它上面应用&&,然后评估||的两个参数.

编译器是否优化自身?我已经使用Visual Studio TC编辑了禁用优化.

sim*_*onc 9

我认为这是C11所涵盖的§6.5.14 Logical OR operator(我的重点)

与按位|不同 运算符,|| 运营商保证从左到右的评估 ; 如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点.如果第一个操作数比较不等于0,则不计算第二个操作数.