逻辑运算的C程序实现
看清短路求值的执行机理,分清位运算与逻辑运算的边界,掌握副作用与求值顺序的所有坑
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
逻辑运算的C程序实现
看清短路求值的执行机理,分清位运算与逻辑运算的边界,掌握副作用与求值顺序的所有坑
逻辑运算问题~1
上一页讲清了 &&、||、! 的写法,但「会写」不等于「写对」。C 语言的逻辑运算有几个隐藏规则——短路求值、结果类型、优先级——正是 bug 的高发地。
学历不达标直接淘汰,后面「项目经验」「面试表现」这些关卡都不用再看了
逻辑运算表达式
上页我们看懂了 `&&`、`||`、`!` 在 C 里怎么写,但这三个运算符一旦组合成表达式,规则就复杂起来——尤其涉及求值顺序、返回类型和优先级。本页聚焦这些容易写错、调试时又难发现的细节。
第一道门就报警(已定结果),后面几道不再检(右侧不执行)
如何判断闰年
上页我们用&&、||把多个布尔条件拼成一个表达式。判断闰年正是它的经典案例——要把整除判断和百年例外复合在同一条表达式里。
基础折扣看年限(%4==0);百年店庆必须满400年才打折
逻辑运算优先级
闰年那行 `year%4==0 && year%100!=0 || year%400==0`,C 编译器不是从左到右一扫而过——它按优先级分层读取。读错层,判断就错位。
先算谁有规则,写代码与写算式一样要分层思考
条件运算符
闰年判断里我们写 if-else 做分支。表达式层面的「二选一」有专用写法——C 里唯一一个三目运算符:条件运算符 ?:。
指示牌(条件)指左(分支1)或右(分支2);只走其中一条,绝不会两条都走
计算结合性
上一页学了条件运算符 `?:`,但如果一行出现两个相同符号(`a=b=c=5` 或两个 `?:` 嵌套),谁先谁后?这就是结合性要回答的问题——同优先级运算符的分组方向。
左结合像穿衣(先袜后鞋,固定从左到右);右结合像套盒(先内后外,从右到左组装)
一个简单实例
前面把结合性、优先级、短路规则都过了一遍,不如拿一个真实小例子把 &&、! 串在一起,一眼看清整套规则怎么落到代码里。
年龄够 + 卡有效 + 未被拉黑,三样都齐才能放行
本节要点
- ✓&& 和 || 有短路特性,一遇确定结果即停
- ✓逻辑运算优先级:! > 算术 > 关系 > && > ||
- ✓逻辑运算符求真假,按位运算符逐位处理
- ✓条件运算符适合简化单值赋值,比 if-else 紧凑
- ✓复杂判断先拆条件再组合,括号标注优先级
课后思考
先自己想一分钟,再点开参考答案看思路。
参考答案例 1:if(p && *p),p 为 NULL 时跳过解引用,避免段错误;例 2:if(d && a/d),d 为 0 时跳过除法,避免崩溃。短路把右侧危险代码拦在左侧为假的门外。
参考答案负偶数(如 -2)和 0 会蒙混过关。|| 只需「能被 2 整除」一项为真就放行,不再要求 x>0,于是负偶数和零都被错误判定为正偶数。
参考答案不完全可靠。C 标准中 % 对负数取模的结果由实现定义,同一个负年份在不同编译器下可能得出不同余数,公式可能判错。需先取绝对值或限定年份范围。