C语言学习笔记 - 45.运算符和表达式 - 运算符3 - 逻辑运算符

逻辑运算符概述

C语言提供三种基本逻辑运算符,用于实现复杂的条件判断:

  • !:逻辑非(单目运算符,对操作数的逻辑值取反)。

  • &&:逻辑与(双目运算符,表示"并且"关系)。

  • ||:逻辑或(双目运算符,表示"或者"关系)。

注意 :&&是两个连续的&符号,不要与单目取地址符&混淆;||是两个连续的|符号。


C语言中真假的判定规则

C语言通过数值直接表示逻辑真假,无需专门的布尔类型(C99虽新增_Bool类型,但核心判定规则不变):

  • 非零值 :表示逻辑真(所有不等于0的数值,包括正数、负数、字符等)。

  • 零值 :表示逻辑假(仅数值0)。

逻辑运算的最终结果只有两个固定值:

  • 真:用整数1表示。

  • 假:用整数0表示。

也就是说,任何非零数值参与逻辑运算时都会被当作"真"处理,但逻辑运算的输出只能是1或0。


逻辑运算符的运算规则

1. 逻辑非(!)

单目运算符,对操作数的逻辑值取反:

  • 若操作数为真(非零),结果为假(0)。

  • 若操作数为假(零),结果为真(1)。

2. 逻辑与(&&)

双目运算符,只有当两个操作数同时为真时,结果才为真;只要有一个操作数为假,结果即为假。

3. 逻辑或(||)

双目运算符,只要有一个操作数为真,结果即为真;只有当两个操作数同时为假时,结果才为假。

三种逻辑运算符的真值表如下:

操作数a 操作数b !a a && b a b
真 真 假 真 真
真 假 假 假 真
假 真 真 假 真
假 假 真 假 假

逻辑运算符的短路特性

逻辑运算符具有短路求值特性:当通过左边表达式的值已经能完全确定整个逻辑运算的结果时,右边的表达式将不会被执行。这是C语言中非常重要的特性,也是初学者最容易出错的知识点之一。

1. 逻辑与(&&)的短路

当&&左边的表达式为假 时,无论右边表达式的值是什么,整个逻辑与的结果都必然为假,因此右边的表达式不会被执行。

2. 逻辑或(||)的短路

当||左边的表达式为真 时,无论右边表达式的值是什么,整个逻辑或的结果都必然为真,因此右边的表达式不会被执行。


表达式与语句的区别

  • 表达式 :由运算符和操作数组成,末尾没有分号 ,可以计算出一个确定的值。例如:3>2、k=8、a && b都是合法的表达式。

  • 语句 :表达式末尾加上分号就构成语句,是C程序的基本执行单元。例如:printf("M=%d\n", M);是完整的输出语句。


代码示例与解析

示例1:逻辑与基本运算

复制代码
#include <stdio.h>

int main()
{
    int r = 10;  // 未参与运算,仅演示变量定义
    int k = 20;
    int M;

    M = 3 > 2 && (k = 8);  // 3>2为真,执行右边的赋值表达式
    printf("M=%d\n", M);   // 逻辑与结果为真,输出M=1
    printf("k=%d\n", k);   // k被成功赋值为8,输出k=8

    return 0;
}

运行结果:

复制代码
M=1
k=8

解析:

  • 3>2为真(非零),无法确定整个逻辑与的结果,因此必须执行右边的(k=8)。

  • 赋值表达式k=8的值为8(非零,真),因此3>2 && (k=8)的结果为真,M被赋值为1。

  • 变量k的值被修改为8。

示例2:逻辑与的短路特性

复制代码
#include <stdio.h>

int main()
{
    int k = 20;
    int M;

    M = 1 > 2 && (k = 5);  // 1>2为假,触发短路,右边k=5不执行
    printf("M=%d\n", M);   // 逻辑与结果为假,输出M=0
    printf("k=%d\n", k);   // k保持原值20,输出k=20

    return 0;
}

运行结果:

复制代码
M=0
k=20

解析:

  • 1>2为假(零),根据逻辑与的短路特性,右边的(k=5)不会被执行。

  • 整个表达式结果直接判定为假,M被赋值为0。

  • 变量k的值未被修改,仍然是初始值20。

示例3:逻辑或的短路特性

复制代码
#include <stdio.h>

int main()
{
    int k = 20;
    int M;

    M = 1 > 2 || (k = 5);  // 1>2为假,不触发短路,执行右边k=5
    printf("M=%d\n", M);   // 逻辑或结果为真,输出M=1
    printf("k=%d\n", k);   // k被赋值为5,输出k=5

    return 0;
}

运行结果:

复制代码
M=1
k=5

解析:

  • 1>2为假(零),无法确定整个逻辑或的结果,因此必须执行右边的(k=5)。

  • 赋值表达式k=5的值为5(非零,真),因此整个表达式结果为真,M被赋值为1。

  • 变量k的值被修改为5。


要点总结

  1. 真假判定 :C语言中非零为真,零为假,逻辑运算的结果只能是1(真)或0(假)。

  2. 运算规则:

    • 逻辑与&&:全真为真,一假则假。

    • 逻辑或||:一真则真,全假则假。

  3. 短路特性:

    • &&:左边为假时,右边表达式不执行。

    • ||:左边为真时,右边表达式不执行。

  4. 注意事项:短路特性会导致右边的赋值、函数调用等操作不被执行,编程时需避免依赖短路表达式中的副作用。

相关推荐
2501_92697833几秒前
给自指系统接一个外部锚 —— 一个关于「用 AI 观察自己」的方法
人工智能·经验分享·笔记·机器学习·ai写作
li星野14 分钟前
DO — Auxiliary Verb (One-Page Notes)
学习
minglie118 分钟前
关系的有向管道模型
学习
小灰灰搞电子1 小时前
C语言 <time.h> 头文件详解
c语言·time.h
~kiss~2 小时前
LangChain 基础学习
学习·langchain
一木 之林2 小时前
提示词工程学习总结:用 Few-shot 把大模型调教成金融文本分类、抽取与匹配的自动化流水线
人工智能·学习·计算机视觉·金融·分类
C++ 老炮儿的技术栈2 小时前
sizeof操作符
c语言·c++·人工智能·mfc·c
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
wuminyu3 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
我命由我123453 小时前
Photoshop - Photoshop 使用对齐功能定位元素
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·学习方法