C语言中的 && 和 ||
1 逻辑与 &&
&&
逻辑与运算符,常用于判断语句,可以认为是
同时
的意思。例如以下代码:
1. int a, b;
2. a = 1;
3. b = 2;
4. if ((a < 0) && (b <= 1)) ;
5. while((a > 1) && (b > 1)) ;
在以上的代码中,我们将
&&
理解成
同时
就能轻松读懂代码,这也就意味着只有
&&
运算符两边的表达式都满足才能判定成true。上述的代码如果将逻辑与(
&&
)换成与(
&
)运算符其实也可以,例如:
1. if ((a < 0) & (b <= 1)) ;
2. while((a > 1) & (b > 1)) ;
重点来了,逻辑与(
&&
)和与(
&
)运算是由区别的。
&: 需要将运算符两边的表达式都运行一遍,即 (a < 0) & (b <= 1),
则需运行 (a < 0) 得到 false 的结果,再运行 (b <= 1) 得到 true 的结果,
最终将代码重新规整为 if(false & true);
&&:代码从左往右执行,一旦发现有一个是 false 便终止另一边的运行,即 (a < 0) & (b <= 1),
则运行 (a < 0) 得到 false 的结果,那么将不再运行 (b <= 1) ,因为只要有一个表达式是 false
就能直接得出结论,即 (a < 0) & (b <= 1) 的结果为 false
2 逻辑或 ||
同逻辑与的执行方式一样,运行原则同或运算符一样。即 a || b,a为 true,则不进行b的判断。
3 案例演示
不少人会有同样的疑问,逻辑与、逻辑或,我们知道它俩的执行方式都是从左往右,这有什么实际意义呢?我们的团队为了能使用户直接体会其中的含义,特地选取1个例子来加以说明。
例子要求
:等待1次信号量,而后便一直执行 printf 语句。
1. int once_b = 1; // 一次性执行标志位,=1可执行,=0不执行
2. while(1) {
3. if (os_wait1(K_SIG) && once_b) {
4. once_b = 0;
5. }
6. if (once_b == 0) {
7. printf("持续执行这句话.\n");
8. }
9. }
分析一下,os_wait1(K_SIG) 是一个等待信号量的函数,只有当接收到信号量代码才能继续执行,否则代码将卡在这个等待函数这里。假设现在信号量被接收了,代码运行到 printf 然后回到 os_wait1(K_SIG) 继续等待。但实际上我们只想等待1次信号量即可,下次代码执行到这里时能不再执行 os_wait1(K_SIG) 函数,所以我们将上述的代码进行修改:
1. int once_b = 1; // 一次性执行标志位,=1可执行,=0不执行
2. while(1) {
3. if (once_b && os_wait1(K_SIG)) { // 修改此处
4. once_b = 0;
5. }
6. if (once_b == 0) {
7. printf("持续执行这句话.\n");
8. }
9. }
当信号接收1次后,once_b 变量等于0,于是下次再到 if 语句时,由于once_b 等于0也就不再执行 os_wait1(K_SIG) 函数,以此就能满足我们的要求了。
至此,我们的介绍结束,该篇对逻辑或(
||
)的介绍相对较少,因为它的使用意义跟逻辑与(
&&
)一样,所以不做过多的冗余讲解。