C语言中,提供了以下三种逻辑运算符。
一元运算符:!(逻辑非)
二元运算符:&&(逻辑与)、||(逻辑或)
以上三种逻辑运算符中,逻辑非 ! 的优先级最高,逻辑与 && 次之,逻辑或 || 优先级最低。
先看题目
#include <stdio.h>
int main()
{
int a,b,c;
a=b=c=0;
if(++a || ++b && ++c)
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
程序的输出是:
a=1,b=0,c=0
在做C语言练习题的过程中,关于与运算符&&与或运算符||的优先级问题困扰了我很久,有人说&&比||的优先级高,但就像上面的题目,如果是&&的优先级高,那应该b与c的值会+1,然而并没有。
查了baidu,问同学,最后总结如下:
&&与||是同级,看哪个在前就先算哪个。要说优先级,它们的优先级体现在结合上,即++b与++c结合起来做与运算&&,即(++a || (++b && ++c)),
进行运算时,从++a开始运算,a的值已经由0变为1,所以或运算||成立,后面的++b与++c不再执行。
关于这两个运算符,还有一点要注意的是——
&&与||都有“短路”运算。
对于&&运算,则从左到右进行判断,如果左边为0,则右边不再计算,整个&&运算就是0。
对于||运算,也是从左到右进行判断,如果左边为1,则右边不再计算,整个||运算就是1。
所以我们在代码编写时要注意这一点,以防由于&&和||的短路运算,导致写出来的代码运算结果与预期的不同。