C/C++关于逻辑运算符“&&”和“||”的优先级问题及实验

  • Post author:
  • Post category:其他




C/C++关于逻辑运算符“&&”和“||”的优先级问题及实验



目录:



1、前言;



2、实验代码及运行结果;



3、总结。



1、前言

在许多相关教材中,对于逻辑运算符“&&”和“||”的优先级问题,大都只有这样一句简单的描述:“逻辑运算符‘&&’的优先级高于逻辑运算符‘||’”。而在实际应用中我们会发现,它们的优先级关系并不像这句描述那样简单,或者说,并不像我们平常所想的“先算后算”那样的优先级。

本文将就该问题展开讨论和实验,以探索它们真正的优先级关系,供初学者学习和参考。如果以下内容有误,还望不吝指出。



2、实验代码及运行结果



2.1在只有“&&”时

#include<stdio.h>
int main() 
{
 int x = 0, y = 1;
 (y = 2) && (x = 1) && (x += 1);
 //结果:x=2,y=2;
 printf("x = %d , y = %d\n", x, y);
 (y = 3) && (0) && (x = 3);
 //结果:x=2,y=3;
 printf("x = %d , y = %d\n", x, y);
 (0) && (y = 4) && (x = 4);
 //结果:x=3,y=3;
 printf("x = %d , y = %d\n", x, y);
 (y = 5) && (1) && (x = 5);
 //结果:x=5,y=5;
 return 0;
}

运行结果:

在这里插入图片描述

显而易见,当只有逻辑运算符“&&”时,程序遵循从左至右的原则依次运算,当遇到值或表达式的值为“0”(即“false”)时,跳过此后的所有运算(即“短路”),当遇到值或表达式的值不为“0”时,继续完成后面的所有运算。



2.2在只有“||”时

#include<stdio.h>
int main() 
{
 int x = 0, y = 1;
 (y = 2)|| (x = 1) || (x += 1);
 //结果:x=0,y=2;
 printf("x = %d , y = %d\n", x, y);
 (y = 3) || (0) || (x = 3);
 //结果:x=0.y=3;
 printf("x = %d , y = %d\n", x, y);
 (0) || (y = 4) || (x = 4);
 //结果:x=0,y=4;
 printf("x = %d , y = %d\n", x, y);
 (0) || (0) || (x = 5)||(y=5);
 //结果:x=5,y=4;
 printf("x = %d , y = %d\n", x, y);
 return 0;
}

运行结果:

在这里插入图片描述
由运行结果可知,当只有逻辑运算符“||”时,程序遵循从左至右的原则依次运算,当遇到值或表达式的值为“1”(即“ture”)时,跳过此后的所有运算(即“短路”),当遇到值或表达式的值不为“1”时,继续完成后面的所有运算。



2.3“&&”和“||”混合时

#include<stdio.h>
int main()
{
 int x = 1, y = 1;
 (0) || (x = 2) && (y = 2);
 //结果:x=2,y=2;
 printf("x=%d,y=%d\n", x, y);
 (x = 3) || (0) && (y = 3);
 //结果:x=3,y=2;
 printf("x=%d,y=%d\n", x, y);
 (0) || (0) && (y = 4);
 //结果:x=3,y=2;
 printf("x=%d,y=%d\n", x, y);
 (y = 5) && (1) || (x = 5);
 printf("x=%d,y=%d\n", x, y);
 //结果:x=3,y=4;
 (y = 6) && (0) || (x = 6);
 //结果:x=6,y=6;
 printf("x=%d,y=%d\n", x, y);
 (0) && (y = 7) || (x = 7);
 //结果:x=7,y=6;
 printf("x=%d,y=%d\n", x, y);
 (0) && (0) || (x = 8);
 //结果:x=8,y=6;
 printf("x=%d,y=%d\n", x, y);
 return 0;
}

运行结果:

在这里插入图片描述

由实验代码及实验结果我们可以归纳出“&&”和“||”混合时的运算顺序:

1、当“||”在前时,若“||”不短路,则依次完成后面的所有运算;反之,如只有“||”时短路,跳过此后的所有运算;但是当“||”左右值均为“0”时,与“&&”结合的运算也将被跳过。

2、当“&&”在前时,若“&&”未发生“短路”,则继续执行后面的“||”运算;若“&&”发生“短路”,则与“&&”结合的表达式不计算,而完成与“||”结合的运算;即使“&&”左右的值均为“0”,依旧完成后面的运算。



3、总结

由以上实验我们可以发现,优先级并不决定运算顺序!

那优先级到底决定什么呢?

在百度百科上优先级的解释:

在这里插入图片描述

在这里插入图片描述
据此,我们再次分析这一条语句“ (x = 3) || (0) && (y = 3)”:“0”与“(y=3)”优先结合作为一个整体再与“||”结合,而求值顺序仍然还是从左至右,所以“(x=3)”使“||”短路而跳过后面的“(0)&&(y=3)”,所以结果为:x=3,y=2。



综上可知,&&比||优先级高,仅仅确定了结合顺序,而运算顺序仍然是从左到右!

希望对此问题有疑惑的读者可以在阅读完这篇文章后解决自己的疑惑,如文章中存在错误之处,还望指出。

参考文献:


C/C++逻辑运算符 | | 和 && 的优先级误区——优先级决定运算顺序吗?



版权声明:本文为m0_51444969原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。