关系运算的C程序实现

官官方信息技术老师·20 页·深入(追求细节与边界)·0 次浏览·38 天前
关系运算符0与1C语言常见陷阱

关系运算的C程序实现

看完你能说清六个关系运算符在C里如何运算、为何结果是0或1、以及==与=混用的陷阱

按 空格/→ 演示下一步

问一句
1 / 20 页

全部页面点击任意一页,跳回舞台从这页播放

关系运算符0与1C语言常见陷阱

关系运算的C程序实现

看完你能说清六个关系运算符在C里如何运算、为何结果是0或1、以及==与=混用的陷阱

1第 1 页 · 关系运算的C程序实现

生活里的「关系比较」

体检时医生说「你比你爸高 3 厘米」,老师看成绩说「你和第一名差 2 分」——生活里我们天天在比较大小、比相等。C 程序里,这种比较就是关系运算。

大小关系
身高比高低:谁更大、谁更小,如 a > b、a < b
相等关系
比分数是否一样:a == b;注意一个 = 是赋值,两个 = 才是比较
结果只有真假
比较结果不是数的大小,只有「成立(1)」或「不成立(0)
体检报身高对应 →关系运算

「你比他高」的判断对应 C 里的 a > b,答案只有是或否

2第 2 页 · 生活里的「关系比较」

为什么程序需要比较

上节我们看到生活里满是「谁大谁小」的比较。程序也一样:水温够不够热?密码对不对?钱够不够扣?先比出真假,程序才知道接下来走哪条路。

分支的前提
if、while 都先要一个真/假判断才能决定走向
真假即数据
C 里非 0 为真,0 为假,比较结果可以直接当数用
关系运算符
>、<、>=、<=、==、!= 六种,结果是 1 或 0
边界最易错
>= 还是 >?== 别误写成 =,编译器未必报错
路口红绿灯对应 →程序分支

先看灯判断能不能走(比较出真假),再决定停或行(走哪个分支)

(3>5)+(2>1)=0+1=1(3 > 5) + (2 > 1) = 0 + 1 = 1
3第 3 页 · 为什么程序需要比较

关系表达式是什么

上一页我们看到程序需要比较大小才能做判断。那「比较」这件事在 C 语言里到底怎么表达?答案是用关系表达式——先看几个生活例子再拆解它的结构。

定义
用关系运算符(如 >、==)连接两个式子,就构成关系表达式
结果只有两种
成立得 1,不成立得 0,没有中间状态
1 和 0 是真值
C 没有 true/false 关键字,用整数 1/0 表示逻辑真假
可以参与运算
既然结果是数值,就能赋值、比较、进算式
体温计测量对应 →关系表达式

体温计的读数只有发烧与否的判断对应表达式的 1 或 0

4第 4 页 · 关系表达式是什么

六个关系运算符

六个符号长得像:= 与 ==、= 与 != 最易混。逐对对齐辨析,看清楚它们到底差在哪。

「小于」一族
  • < 小于:a < b,严格小于才成立
  • <= 小于等于:含相等的情况
  • 读法:问「a 是否不大于 b」
「等于」一族
  • == 等于:判断两边是否相等
  • != 不等于:相等则结果为假
  • 读法:问「a 与 b 的关系是否成立」
正确的理解是:六者都只产出 0 或 1;<= 别写成 =<,== 别写成 =。
5第 5 页 · 六个关系运算符

== 与 = 混淆辨析

== 是比较两个值,= 是存值进去。两者长得像,但意思完全不同,写错编译器常常不报错,是初学者头号陷阱。

赋值运算符 =
  • 作用:把右边的值存进左边的变量
  • 表达式本身的值是被赋的那个值
  • if (x = 5) 恒为真,还会悄悄改掉 x
相等判断 ==
  • 作用:比较两边是否相等,不改任何值
  • 表达式的值只有 0(假)或 1(真)
  • if (x == 5) 才是「x 等于 5 吗」
想存值时用 =,想判断时用 ==。推荐写 if (5 == x):误写成 = 时编译器直接报错。
6第 6 页 · == 与 = 混淆辨析

真假在C里怎么表示

c

看关系表达式的值到底是什么:打印 1、0,再让非零值当条件用。

代码高亮加载中…

关系表达式只有两个值:成立得 1,不成立得 0;if 条件里非零都算真,0 才是假。

7第 7 页 · 真假在C里怎么表示

关系表达式求值示例

c

把六个关系表达式各打印一次,亲眼看到结果只有 1 或 0。

代码高亮加载中…

每个表达式直接放进 printf 的 %d 槽位:真打印 1,假打印 0,混合运算时先算 2+3 再比较 5>4。

8第 8 页 · 关系表达式求值示例

优先级层级图

从上到下四层:谁的层级高,谁先被计算。逐层往下看。

图解渲染中…
root:越靠上层级越高,同级才按结合性赋值运算:= 层级最低,几乎最后才算
9第 9 页 · 优先级层级图

混合表达式求值

c

两个经典混合表达式,看优先级如何决定求值顺序与结果。

代码高亮加载中…

== 优先级低于 >,故 a>b==c 先比大小再判相等;算术优先级最高,a+b 先算再比较。

10第 10 页 · 混合表达式求值

结合性与连续比较

以 a<b<c 为例,逐层拆开C编译器到底怎么算它。

1
先算 a<b
左结合:< 从左往右结合,先求出 a<b 的值,结果是 0 或 1
2
结果代入
把 0 或 1 当作普通整数,替换掉整个子表达式 a<b
3
再算 <c
用 0 或 1 与 c 比较,得到最终结果 0 或 1
4
对比数学
数学的 a<b<c 是三者同时成立;C里只比了 0/1 与 c
11第 11 页 · 结合性与连续比较

条件判断中的关系表达式

前页我们算出了关系表达式的值——只有 1 或 0。但算出来之后程序怎么办?答案就是 if 语句:它盯着这个真假值,据此决定接下来走哪条路。

if 的骨架
if (关系表达式) {…} else {…},括号里放比较
真走 if 块
表达式值为 1(真)时,执行 if 后面的花括号
假走 else 块
值为 0(假)时跳过 if 块,转去执行 else
无 else 直落
没有 else 且为假时,if 块整体跳过继续往下
路口看红绿灯对应 →if 分支选择

值 1 像绿灯走 if 路,值 0 像红灯走 else 路

12第 12 页 · 条件判断中的关系表达式

判断条件写法示例

c

一个及格判断程序:关系表达式的值直接当作 if 的判断条件。

代码高亮加载中…

if 不挑「类型」,只要一个数:非零成立、零不成立。关系表达式恰好产生 1 或 0,天然就是判断条件。

13第 13 页 · 判断条件写法示例

程序实例:比大小

c

一个完整可运行的程序:输入两个数,用关系表达式判断并输出较大者。

代码高亮加载中…

核心在第6行:a > b 是关系表达式,值为1或0,if 正是靠这个真假值选择走哪个分支。

14第 14 页 · 程序实例:比大小

实例执行过程拆解

跟着一段比大小程序,从输入走到输出,看清每一步的执行轨迹。

1
读入数据
scanf 把两个数存进变量 a、b,得到待比较的原料
2
求值表达式
计算 a > b,结果按真假落成 1 或 0
3
条件判断
if 检查该值是否非零,决定走哪个分支
4
分支输出
条件为真打印 a 大,否则打印 b 大或相等
5
程序结束
return 0 交还控制权,轨迹闭合
15第 15 页 · 实例执行过程拆解

字符怎么比较

前页比的是数字,其实字母也能比:'a'<'b'为真。奥秘在于每个字符在内存里都有编号——ASCII码,比较的从来不是字形,而是这些编号的大小。

字符即编码
char存的是ASCII码,如'a'为97、'b'为98
比较编号
'a'<'b'即97<98,结果为真
隐式转换
比较时char自动转成int再运算
大小写差32
'A'为65、'a'为97,可借此判断转换
字典里比页码对应 →字符比较

比字符先后就是比各自所在的页码

16第 16 页 · 字符怎么比较

字符比较代码示例

c

用 char 与关系运算符判断大小写、数字:看字符范围比较的真实写法。

代码高亮加载中…

字符即整数:'A'~'Z'、'a'~'z'、'0'~'9' 的 ASCII 码各自连续,所以范围比较能判大小写与数字,且必须用 && 连接两个关系表达式。

17第 17 页 · 字符比较代码示例

自测:优先级与真假

点击作答

表达式 3 > 2 > 1 在 C 语言中的求值结果是什么?

18第 18 页 · 自测:优先级与真假

要点收束

  • ✓比较的本质是判断,结果只有 0 和 1 两种
  • ✓六个运算符中,== 与 = 的混淆是头号陷阱
  • ✓关系运算符优先级低于算术、高于赋值
  • ✓连续比较 a<b<c 不等于数学含义,需拆开写
  • ✓字符比较底层走 ASCII 码,照样是数值比大小
延伸主题:逻辑运算符与短路求值if-else 分支结构详解浮点数比较的精度陷阱
19第 19 页 · 要点收束

课后思考

先自己想一会儿,再看参考答案——问题不怕想偏,怕不想。

1为什么 C 语言要同时存在 = 和 == 两个符号?当初合并成一个不行吗?

参考答案想想赋值和比较的使用频率:赋值远比比较频繁。两者语义不同、都高频,分开写能让编译器区分意图,尽管代价是 a=0 与 a==0 这种经典笔误。

2写一个程序,读入两个字符并判断谁先谁后——不查 ASCII 表,怎么确定'c'和'A'谁大?

参考答案路径:字符在比较时会取其编码值参与运算。利用已学规则:同一编码体系里字母连续排列,大小写是两段不重叠的区间。可以打印 (int) 值验证猜测。

3数学里 0≤x≤10 能原样写成 0 <= x <= 10 吗?会出什么问题?

参考答案不能。结合性使它按 (0<=x)<=10 求值,左边是 0 或 1,永远成立,x 越界也检测不到。应写成 0<=x && x<=10。

20第 20 页 · 课后思考