C语言小课堂:关系表达式

今天,我们要一起探索一个在编程中扮演着判断官角色的重要概念——关系表达式。

一、知识点讲解

  1. 关系表达式是什么?

在C语言中,关系表达式(Relational Expression)是用来比较两个值之间关系的表达式。它由两个操作数(可以是变量、常量、其他表达式的结果)和一个关系运算符组成。关系表达式的求值结果是一个逻辑值,在C语言中,这个逻辑值通常用整数来表示:

真(True):非零值,通常用 1 表示。

假(False):零值,通常用 0 表示。

你可以把它想象成一个问题,比如“A比B大吗?”或者“X等于Y吗?”它会给你一个明确的“是”或“否”的答案。

C语言提供了以下六种关系运算符:

运算符 含义 示例 结果(假设 a=5, b=3)
< 小于 a < b 0 (假)
<= 小于等于 a <= b 0 (假)
> 大于 a > b 1 (真)
>= 大于等于 a >= b 1 (真)
== 等于 a == b 0 (假)
!= 不等于 a != b 1 (真)

注意: 千万不要把赋值运算符 = 和关系运算符 == 混淆! = 是用来给变量赋值的,而 == 是用来判断两个值是否相等的。这是一个非常常见的初学者错误,一定要牢记!

  1. 关系表达式何时用?

关系表达式主要用于程序中的条件判断。当我们需要根据某个条件来决定程序的执行路径时,关系表达式就派上用场了。它在控制流语句中扮演着核心角色,比如:

if 语句:如果条件为真,则执行特定代码块。

if (score >= 60) {
printf("恭喜你,及格了!\n");
}

while 循环 :只要条件为真,就重复执行代码块。

while (count < 10) {
// 执行某些操作
count++;
}

for 循环 :在循环条件中也经常使用关系表达式。

for (int i = 0; i < 5; i++) {
// ...
}

为什么用?

因为现实世界充满了各种选择和变化。程序要模拟现实,就必须能够根据不同的情况做出不同的响应。关系表达式就是实现这种“智能决策”的基础。没有它,我们的程序就只能按照固定的流程执行,无法应对复杂多变的需求。

与关联知识点的联系与区别:

算术表达式:算术表达式进行数值计算(如 a + b),结果是数值。关系表达式进行比较判断,结果是逻辑值(0或1)。

逻辑表达式:逻辑表达式用于组合多个关系表达式或其他逻辑值,通过逻辑运算符(&&||!)来形成更复杂的条件。关系表达式是逻辑表达式的基础组成部分。

赋值表达式:赋值表达式用于给变量赋值(如 a = 10),结果是被赋的值。关系表达式用于比较,结果是0或1。

特性/表达式类型 算术表达式 关系表达式 逻辑表达式 赋值表达式
目的 数值计算 比较判断 组合条件 变量赋值
运算符 + , - , * , / , % < , <= , > , >= , == , != && ,
结果类型 数值 逻辑值(0或1) 逻辑值(0或1) 被赋的值
典型应用 计算总分 判断是否及格 判断是否满足多个条件 更新变量值
  1. 关系表达式怎么用?

让我们通过几个简单的代码例子来看看关系表达式如何在实际中发挥作用。

场景一:判断一个数是否为正数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);

// 使用关系表达式判断 num 是否大于 0
if (num > 0) {
printf("%d 是一个正数。\n", num);
} else if (num == 0) { // 使用关系表达式判断 num 是否等于 0
printf("%d 是零。\n", num);
} else { // num < 0
printf("%d 是一个负数。\n", num);
}

return 0;
}

在这个例子中, num > 0num == 0 就是关系表达式。它们根据 num 的值,决定了程序会输出哪句话。

场景二:检查用户输入的密码是否正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h> // 使用字符串比较函数 strcmp

int main() {
char correctPassword[] = "123456";
char inputPassword[20];

printf("请输入密码:");
scanf("%s", inputPassword);

// 对于字符串比较,不能直接使用 ==,需要使用 strcmp 函数
// strcmp 返回 0 表示两个字符串相等
if (strcmp(inputPassword, correctPassword) == 0) {
printf("密码正确,欢迎登录!\n");
} else {
printf("密码错误,请重试。\n");
}

return 0;
}

这里 strcmp(inputPassword, correctPassword) == 0 也是一个关系表达式,只不过它的左操作数是一个函数调用的结果。它判断了用户输入的密码和预设的密码是否一致。

场景三:循环直到满足某个条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main() {
int guess;
int target = 7; // 假设我们要猜的数是7

printf("猜一个1到10之间的数字:\n");

// 只要猜的数字不等于目标数字,就一直循环
while (guess != target) { // 关系表达式作为循环条件
printf("你的猜测是:");
scanf("%d", &guess);

if (guess < target) {
printf("太小了,再猜大一点!\n");
} else if (guess > target) {
printf("太大了,再猜小一点!\n");
}
}

printf("恭喜你,猜对了!就是 %d!\n", target);

return 0;
}

在这个“猜数字”游戏中,guess != targetwhile 循环的条件。只要这个关系表达式为真(即猜的数字不等于目标数字),循环就会继续。

二、典型习题

  1. 选择题

以下哪个C语言运算符用于判断两个值是否相等?

A. =

B. ==

C. !=

D. ===

  1. 判断题

在C语言中,关系表达式的结果只有真(1)和假(0)两种可能。

  1. 填空题

表达式 5 > 3 的结果是 。 表达式 10 <= 10 的结果是 。 表达式 7 != 7 的结果是 ____

  1. 编程题(初级)

编写一个C程序,接收用户输入的两个整数 ab ,然后判断并输出 a 是否大于 b

  1. 编程题(中级)

编写一个C程序,模拟一个简单的“年龄验证”系统。程序要求用户输入年龄,如果年龄在18到65岁之间(包含18和65),则输出“您是适龄工作者。”;否则,输出“您的年龄不符合要求。”。

三、习题讲解

  1. 选择题

以下哪个C语言运算符用于判断两个值是否相等?

A. =

B. ==

C. !=

D. ===

答案:B

解析:

A. = 是赋值运算符,用于将右侧的值赋给左侧的变量。

B. == 是关系运算符,用于判断两个值是否相等。

C. != 是关系运算符,用于判断两个值是否不相等。

D. === 在C语言中不存在,它是JavaScript等其他语言中的严格相等运算符。

  1. 判断题

在C语言中,关系表达式的结果只有真(1)和假(0)两种可能。

答案:错误

解析:虽然关系表达式的结果通常是1(真)或0(假),但从严格意义上讲,C语言中任何非零值都被视为“真”,而零被视为“假”。所以,关系表达式的结果是非零值(真)或零值(假)。通常情况下,关系表达式的“真”结果是1,但理论上也可以是其他非零整数。例如,int x = (5 > 3); 之后, x 的值会是 1

  1. 填空题

表达式 5 > 3 的结果是 。 表达式 10 <= 10 的结果是 。 表达式 7 != 7 的结果是 ____

答案:表达式 5 > 3 的结果是 1。 表达式 10 <= 10 的结果是 1。 表达式 7 != 7 的结果是 0

解析:

5 > 3:5确实大于3,所以结果为真,即 1

10 <= 10:10小于等于10(满足等于条件),所以结果为真,即 1

7 != 7:7不等于7是假的,所以结果为假,即 0

  1. 编程题(初级)

编写一个C程序,接收用户输入的两个整数 ab ,然后判断并输出 a 是否大于 b

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main() {
int a, b;

printf("请输入第一个整数 a:");
scanf("%d", &a);
printf("请输入第二个整数 b:");
scanf("%d", &b);

// 使用关系表达式 a > b 进行判断
if (a > b) {
printf("a (%d) 大于 b (%d)。\n", a, b);
} else if (a < b) { // 也可以加上小于的判断
printf("a (%d) 小于 b (%d)。\n", a, b);
} else { // 最后就是 a == b
printf("a (%d) 等于 b (%d)。\n", a, b);
}

return 0;
}

解析:这道题考察了最基本的 > 关系运算符以及 if-else if-else 结构。通过 scanf 获取用户输入,然后直接在 if 语句的条件中使用 a > b 这个关系表达式。根据其真假值,执行不同的 printf 语句。为了程序的完整性,还加入了 a < ba == b 的判断。

  1. 编程题(中级)

编写一个C程序,模拟一个简单的“年龄验证”系统。程序要求用户输入年龄,如果年龄在18到65岁之间(包含18和65),则输出“您是适龄工作者。”;否则,输出“您的年龄不符合要求。”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main() {
int age;

printf("请输入您的年龄:");
scanf("%d", &age);

// 使用两个关系表达式并通过逻辑与运算符 && 组合
// age >= 18 判断年龄是否大于等于18
// age <= 65 判断年龄是否小于等于65
// 只有当两个条件都为真时,整个表达式才为真
if (age >= 18 && age <= 65) {
printf("您是适龄工作者。\n");
} else {
printf("您的年龄不符合要求。\n");
}

return 0;
}

解析:这道题不仅考察了关系表达式,还引入了逻辑运算符 &&(逻辑与)。“年龄在18到65岁之间”意味着两个条件必须同时满足:年龄大于等于18 并且 年龄小于等于65。因此,我们使用了 age >= 18age <= 65 这两个关系表达式,并通过 && 将它们连接起来。只有当 age >= 18 为真且 age <= 65 也为真时,整个 if 语句的条件才为真,程序才会输出“您是适龄工作者。”。这是一个非常实用的组合条件判断的例子。

这世间的事,无非是“是”与“否”的排列组合,那些看似简单的关系表达式,正是在教我们如何清晰地辨别,如何果断地抉择,然后,继续向前。