本文 ——2025-5-22第二次——博客链接:https://gitee.com/donghua-wanli/blog-code
之前我们已经讲解了:占位符、转义字符(C语言专栏第一讲):
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. 逻辑与运算符
a | b | a&&b |
非0 | 非0 | 1 |
非0 | 0 | 0 |
0 | 非0 | 0 |
0 | 0 | 0 |
&& 就是与运算符,也是并且的意思,&& 是一个双目操作符,使用的方式是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. 逻辑或运算符
a | b | a||b |
非0 | 非0 | 1 |
非0 | 0 | 1 |
0 | 非0 | 1 |
0 | 0 | 0 |
|| 就是或运算符,也就是或者的意思,|| 也是一个双目操作符,使用的方式是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. ||
(逻辑或):至少一侧为真时为真,否则为假(短路特性:左为真时右不计算)。
嗯,希望能够得到你的关注,希望我的内容能够给你带来帮助,希望有幸能够和你一起成长。
写这篇博客的时候天气很好,我走到阳台拍下了一张宿舍对面的照片作为本文的封面。