C语言中| |和&&运算符的优先级

C语言中| |和&&运算符的优先级,c,C,输出: -2 2 0 1 为什么表达式m=++i | |++j&&++k;不解析为m=++i | |++j&&++k,因为&&的优先级高于| || |&&是短路运算符。如果从左操作数计算最终结果,则不计算右操作数 #include <stdio.h> int main() { int i=-3,j=2,k=0,m; m = ++i || ++j && ++k; printf("%d %d %d %d", i, j, k, m); } 这是不保证的,

输出:

-2 2 0 1

为什么表达式m=++i | |++j&&++k;不解析为m=++i | |++j&&++k,因为&&的优先级高于| |

| |&&是短路运算符。如果从左操作数计算最终结果,则不计算右操作数

#include <stdio.h>
int main()
{
   int i=-3,j=2,k=0,m;
   m = ++i || ++j && ++k;
   printf("%d %d %d %d", i, j, k, m);
}

这是不保证的,并且特定于编译器实现。不,这是由specs@Atmocreations类C语言中的逻辑运算符总是被standard@Atmocreations6.5.13/4…操作员保证从左到右的评估;如果对第二个操作数求值,则在第一个操作数求值和第二个操作数求值之间有一个序列点。如果第一个操作数的比较值等于0,则不计算第二个操作数。标准再清楚不过了。非常巧合的是,您的程序使用了与重复问题完全相同的变量和值@巴尔马:它没有;副本在allah处不使用| |,它们完全相同,只是第一个&&已更改为| |。运算符优先级!=求值顺序和从左到右的关联性!=从左到右的评估。
++i ||  /* Evaluate ++i which is -2, so the result of expression is 1 */
  ++j && ++k;  /* No need to evaluated this */