第四讲:C 语言操作符详解:从关系判断到逻辑短路

#新星杯·14天创作挑战营·第11期#

本文 ——2025-5-22第二次——博客链接:https://gitee.com/donghua-wanli/blog-code

Blog code: 本仓库仅用于存放博客上的代码

之前我们已经讲解了:占位符、转义字符(C语言专栏第一讲):

C 语言快速入门:从环境搭建到基础概念解析-CSDN博客

size of操作符(用来计算数据类型或者变量所占用的内存字节数)(C语言专栏第二讲):

【C 语言入门全解析】从内存管理到代码调试,带你吃透基础核心概念-CSDN博客

算数操作符、赋值操作符、赋值忽略符(C语言专栏第三讲):

C 语言基础操作符与输入输出函数深度解析 —— 从算术运算到 scanf/printf 的灵活运用-CSDN博客

今天我们来从其他三个操作符:关系操作符、条件操作符和逻辑操作符进行引入

一. 关系操作符

就是C语言中用于比较的操作符

> :大于                >= :大于等于

< :小于                <= :小于等于

== :相等操作符                != :不相等操作符

尤其注意相等是 == 而不是 = (这是赋值操作符)

判断关系的表达式的返回值是 0 或者 1 ,用 0 表示假,用 1 表示真。栗子:

#include <stdio.h>
int main()
{
    int a = 5;
    int b = 8;
    int c = (a > b);
    printf("%d\n", c);
    int d = (a < b);
    printf("%d\n",d);
    return 0;
}

这个代码区域我搞懂了,就是复制粘贴一下,这样阅读的体验也好,但是这个运行代码太麻烦了,我还是用VS2022截图吧

我们创建两个变量 c 和 d 用于接受两个关系表达式的返回值,运行一下:

我们知道C语言中 0 表示假,所有的非 0 值表示真,而在关系表达式中,假的返回值是 0 ,真的返回值是 1 。

多个关系操作符不宜连用

这一点很重要,比如我们要判断 b 是不是大于 a 小于 c ,我们可否这样写?

 a < b < c

绝对不可以,这是错误写法

我们举个栗子:

#include <stdio.h>
int main()
{
    int a = 10000;
    int b = 1000;
    int c = 100;
    if (a < b < c)
    {
        printf("%s\n","一千大于一万小于一百");
    }
    return 0;
}

这里的 if 语句我们还没有讲解,现在简单理解为:“如果括号里面的为真,它就会执行大括号的语句”,就行

那么我们运行一下:

它居然真的打印:“一千大于一万小于一百”了,这说明程序认为 if 后面的括号是真!!!

但是这个括号的内容确确实实就是真的!我们来分析一下

在该栗子中,程序先判断 a < b 部分,即 10000 < 1000,这明显是错误的,即,,在上面我我们说过,在关系表达式中,假的返回值是 0 ,真的返回值是 1 。那么既然是假,这个前半段表达式的值为 0 ,然后,进行后半段表达式的判断,即:0 < 100,那么很明显,这个表达式是正确的,即,真,返回值为 1 ,而if 语句的规则:“如果括号里面的为真,它就会执行大括号的语句”,那么程序执行大括号里的printf函数,最终得出这个错误的结论:“一千大于一万小于一百”。

因为我们上面的错误是合乎于C语言语法的“合法公民”,所以编译器根本就不会报错。

而我们要进行这样的比较时,应该使用这种写法:

 a < b && b < c

这里就涉及到逻辑操作符了,就是下面的板块讲解内容。至此,我们需要记住:多个关系操作符不宜连用

相等操作符的良好书写习惯

我们知道,相等操作符== 和 赋值运算符= 是两个不一样的操作符,但是我们有时候可能不小心拉下了一个等号,栗子:

if (x == 36)....//本该写成这样,但是不小心,落下一个成了下面这样

if (x = 36)...//这是符合C语言的语法规范的,时“合法公民”,编译器不会报错,这个时候
              //我们就可以改变一下书写习惯,这羊就算拉下了,编译器也会提醒我们。

//改成这样

if (36 = x)...//

本该写成这样if (x == 36)....,但是不小心,落下一个成了下面这样

if (x = 36)...

但是这是符合C语言的语法规范的,是“合法公民”,编译器不会报错,这个时候我们就可以改变一下书写习惯,这羊就算拉下了,编译器也会提醒我们。改成下面这样:

if (36 = x)...
编译器的报错:

我们可以看到错误提醒:表达式必须是可以修改的左值

这是因为:在 C/C++ 语言中,= 是赋值运算符,用于将右侧表达式的值赋给左侧的变量。所以:

 = 左侧必须是可修改的左值(Lvalue)

合法左值:变量、数组元素、结构体成员、解引用指针等。

非法左值:常量、表达式结果、函数返回值(除非返回引用)。

我们可以利用这一点来养成书写的良好习惯,将常量放在左侧,将变量放在右侧这样就算落下了一个等号,编译器也会提醒我们的。

以上就是关于操作符,我们需要掌握的,剩下的只要按照字面意思理解使用就行,没有特别注意的。

二. 条件操作符​

条件操作符又称三目操作符,之前我们讲解了双目操作符(两个操作数)和单目操作符(一个操作数),顾名思义,三目操作符就是有三个操作数,这是其形式:

表达式1 ? 表达式2 :表达式3

其运算逻辑是:如果表达式1为真,执行表达式2,执行的结果就是整个表达式的结果;如果表达式1为假,执行表达式3,执行的结果就是整个表达式的结果。栗子:


#include <stdio.h>
    int main()
{
    int a = 10000;
    int b = 1000;
    int c;
    scanf("%d %d",&a,&b);
    c = (a > b ? a : b);
    printf("%d\n", c);
    
    return 0;
}

按照这个代码,会将输入的两个数据最大的数据进行输出打印,我们输入56和89,Ctrl+F5运行:

OK,条件操作符,又称三目操作符就是这么简单

三. 逻辑操作符

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

! :逻辑取反运算符(改变单个表达式的真假)。

&& :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

|| :逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。

注:C语言中,非0表示真,0表示假​

1. 逻辑取反运算符 !​

比如,我们有一个变量a ,如果a为真, !a 就是假;如果a为假,!a 就是真。栗子:

同上,这里的 if 语句我们还没有讲解,现在简单理解为:“如果括号里面的为真,它就会执行大括号的语句”,就行,

#include <stdio.h>
    int main()
{
    int a = 10000;

    if (0==!a)
    printf("%s\n", "a weijia");
    
    return 0;
}

我们定义a的时候将其初始化为10000,此时a为真,括号中判断0等于!a ,那么我们运行一下:

哎,出来了个小小问题,整好我吗来讲一下,出现这个提示是因为你之前忘记关闭“Microsoft Visual Studio 调试控制台”了,(就是那个黑的运行程序后弹出的窗口),关了就好了。

我们关闭窗口再运行:

可以看到,逻辑取反运算符!和 “真”的a 结合后的“!a” 是  

总之,如果a为真,!a 就是假,如果a 为假,!a 就是真

2. 逻辑与运算符

aba&&b
非0非01
非0 00
0非00
000

&& 就是与运算符,也是并且的意思,&& 是一个双目操作符,使用的方式是a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

其实就是数学里面的“并且”

还记得我们上面的栗子“一千大于一万小于一百”吗?

错误写法:

#include <stdio.h>
int main()
{
    int a = 10000;
    int b = 1000;
    int c = 100;
    if (a < b < c)
    {
        printf("%s\n","一千大于一万小于一百");
    }
    return 0;
}

正确写法:

#include <stdio.h>
int main()
{
    int a = 10000;
    int b = 1000;
    int c = 100;
    if (a < b && b < c)
    {
        printf("%s\n", "一千大于一万小于一百");
    }
    return 0;
}

此时运行:

可以看到这次就没有打印“一千大于一万小于一百”

3. 逻辑或运算符​

aba||b
非0非01
非001
0非01
000

|| 就是或运算符,也就是或者的意思,|| 也是一个双目操作符,使用的方式是a || b ,|| 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。栗子:

#include <stdio.h>
int main()
{
	int a = 10000;
	int b = 1000;
	int c = 100;
	if (a < b || b < c|| c < b)
	{
		printf("%s", "这里面有一个是对的");
	}

	return 0;
}

我们Ctrl+F5运行:

可以看到:前两个表达式都是假,但是第三个表达式 c < b 是真,故整体为真,printf执行

同上,这里的 if 语句我们还没有讲解,现在简单理解为:“如果括号里面的为真,它就会执行大括号的语句”,就行,

4. 短路

C语言逻辑运算符还有一个特点,它总是先对左侧的表达式判断,再对右边的表达式判断,这个顺序是 保证的。

如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。 如前面的代码:​

	if (a < b && b < c)
	{
		printf("%s","一千大于一万小于一百");
	}

如果第一个表达式 a < b 已经是假(0) 了,那么久没有必要继续判断第二个表达式的真假了,因为这个逻辑操作符是逻辑与不管第二个表达式真还是假,整个表达式的结果都是假的,因此我们称之为:短路

同样的,在逻辑或里

if (a < b || b < c|| c < b)
{
	printf("%s", "这里面有一个是对的");
}

如果第一个表达式为真,那就不需要对后两个表达式进行判断了,因为这是逻辑或,不管第二个第三个表达式真还是假,整个表达式的结果都是真的

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值

练习例题:

预测代码的输出结果:

#include <stdio.h>
int main()
{
	int x= 0, a = 1, b = 2, c = 3, d = 4;	
	x = a++ || ++b || ++c || d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	return 0;
}

请输入结果:                                              

恭喜你回答正确!答案是:

a = 2
b = 2
c = 3
d = 4

你可能觉得紫色的互动内容有点无聊,是的,确实有一点无聊了,但是别急,几篇博客之后,在函数章节时,让我们一起编写一个可以判断你输入正确与否的程序,到时候就以紫色内容作为栗子,这是我们的伏笔

四. 结束总结

本来还是想以六个大点进行讲解,第七点进行总结的,但是接下来的内容三个点可讲不完,还是单开一篇讲解为好。

关系操作符        

用于数值比较,包括 > < >= <= == != 表达式返回值为0(假)或1(真)。需要注意两点:

1.禁止连用(如 a < b < c),需用逻辑操作符连接(如 a < b && b < c)。

2.相等判断用==,避免与赋值符=混淆,可将常量放左侧(如if (36 == x))防止笔误。

条件操作符

格式:表达式1 ? 表达式2 : 表达式3

逻辑:表达式 1 为真取表达式 2 的值,为假取表达式 3 的值。

示例:c = (a > b ? a : b),返回两数中的较大值。

逻辑操作符

1. !(逻辑取反):非 0 变 0,0 变 1(栗子:!a,a为真则结果为假)。

2. &&(逻辑与):两侧均为真时为真,否则为假(短路特性:左为假时右不计算)。

3. ||(逻辑或):至少一侧为真时为真,否则为假(短路特性:左为真时右不计算)。

嗯,希望能够得到你的关注,希望我的内容能够给你带来帮助,希望有幸能够和你一起成长。

写这篇博客的时候天气很好,我走到阳台拍下了一张宿舍对面的照片作为本文的封面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值