C语言之逻辑运算符&&和||

本文介绍了C语言中逻辑运算符&&和||的用法,特别是它们的短路特性,通过实例说明了如何可能导致意料之外的结果,并提供了一个导致问题的代码示例,强调在编程时需要注意的细节。最后,提出了解决问题的方法。

C语言之逻辑运算符&&和||

前言:伍弟子最近在刷剑指offer的面试题21的时候给||逻辑运算符坑的惨惨滴,足足浪费了我好些时间,耽误了我西行的脚步;所以今天索性在此做一个小总结给自己警醒一哈;

1 &&和 2 ||这两个逻辑运算符应该是做开发以来最常用的两个运算符了,平常使用那是顺手拈来,怎么会有坑给人掉呢?可能也只能怪伍弟子水平不够了,咱话不多说,开整!

首先我们从概念上重新梳理一下&&和||:当我们在表达式之间使用&&和||的时候,程序是从左到右运行这些表达式的,并且在这个过程中只要有足够条件判断最后结果是对是错,程序则停止继续运行整个表达式,直接去运行下一个语句。看懂了吗,光说不练假把式,直接整两个例子:

// != 和 == 优先级都比 = 高
// !=, == 等关系运算符优先级比逻辑运算符高
// 所以此处我没有加括号()
bool a = 1 != 2 && 1 == 1 && 2 == 2;	// a的初始化值为false
bool b = 1 == 1 || 1 != 2;				// b的初始化值为true

从上面两个例子我们知道,当初始化a的时候,第一个表达式的结果就是false,后面的逻辑运算符又都是&&,所以我们已经知道了整个表达式的最后结果为false;所以后面两个表达式都不会执行,程序直接执行下一条语句去了;

初始化b的时候,第一个表达式的结果就是true,而且后面的逻辑运算符都是||,所以同上,最终的结果为true;所以后面一个表达式也不会执行,程序直接跳过;

听起来很简单是吧,嗯我也是这么觉得的,为啥说会给坑呢?那就看看:

// 掉坑题目的简化版
bool test() {
	printf("555\n");
	return true;
}

bool a = true;
a = a || test();

简单吧,也简单,就是一开始没想到,因为在我刷题的时候test()是一个必须要执行的函数,但是第一个表达式是true,又因为逻辑运算符||,test()根本没有执行, 所以最后出现了意想不到的结果,就掉坑了;

顺便贴上解决办法吧,总结一下:

// method 1
bool a = true, b = test();
a = a || b;

// method 2
bool a = true;
a = test() || b;

勿以恶小而为之 --《三国志·蜀志传》

欢迎赞赏评论指出不当之处;

更新日志

25/05/2020 updated version 1.0.0


  1. 逻辑运算符与,左右两侧表达式都为真时,结果为真,任意一个为假,结果则为假 ↩︎

  2. 逻辑运算符或,左右两侧都为假时,结果为假,任意一个为真,结果为真 ↩︎

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值