C语言小课堂:if选择

今天我们来学习C语言中的 if 选择结构。

  1. 什么是 if 选择结构?

在C语言中, if 是一种条件控制语句,它允许程序根据某个条件的真假来决定是否执行特定的代码块。你可以把它想象成程序中的一个“决策点”:如果满足某个条件,就执行A操作;否则,就跳过A操作或者执行B操作。

if 语句是程序逻辑控制的基石,它使得程序不再是线性的,而是可以根据输入或内部状态进行动态的行为调整。

  1. 何时用 if ?为什么用它?

当你需要在程序中实现条件判断和分支逻辑 时,就需要使用 if 语句。

什么时候用?

根据用户输入做出不同响应:例如,如果用户输入“是”,则执行某个操作;如果输入“否”,则执行另一个操作。

验证数据有效性:例如,检查用户输入的年龄是否为正数,如果不是,则提示错误。

处理不同情况:例如,计算一个数的绝对值(如果为负数则取反,否则不变)。

实现游戏逻辑:例如,如果玩家得分达到某个阈值,则升级;如果生命值降到零,则游戏结束。

确保程序健壮性:防止除以零的错误,检查文件是否成功打开等。

为什么用它?

实现程序灵活性:让程序能够根据运行时的情况做出不同的行为,而不是固定不变。

模拟现实世界决策:现实世界中的很多决策都是基于条件的(“如果…就…”),if 语句让我们能在代码中模拟这些决策过程。

提高代码可读性和逻辑性:清晰地表达了程序的意图:“在满足A条件时执行B,否则执行C”。

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

switch 语句的联系与区别 :

if 语句适用于更复杂的、基于任意表达式的条件判断(例如,x > 10 && y < 20)。它支持范围判断、逻辑组合等。

switch 语句主要用于基于单个变量或表达式的离散值进行多分支选择(例如,根据一个整数变量的值,执行不同的代码块)。它的可读性在处理大量离散值时通常更好。

通常, if 语句更为通用和灵活,而 switch 语句在特定场景下(如菜单选择)能提供更简洁的代码。

联系: ifswitch 都是条件控制语句,用于实现分支逻辑。

区别:

与循环语句 ( for , while , do-while) 的区别 :

if 语句是关于**“是否执行”**一次某个代码块。

循环语句是关于**“重复执行”**某个代码块,直到某个条件不再满足。

它们经常结合使用:在循环内部使用 if 来处理每次迭代中的特定条件。

if 选择结构是C语言乃至所有编程语言中最基本、最常用的控制结构之一,掌握它对于编写任何有意义的程序都至关重要。

  1. 怎么用 if

if 语句有几种常见的形式:

3.1. if 语句(基本形式)

语法:

if (条件表达式) {
// 当条件表达式为真(非零)时执行的代码块
}

说明:

条件表达式:通常是一个关系表达式(如 a > b )、逻辑表达式(如 x > 0 && y < 10)或任何可以求值为非零(真)或零(假)的表达式。

{}:花括号 {} 定义了一个代码块。如果 if 后面只有一条语句,可以省略花括号,但为了代码清晰和避免潜在错误,强烈建议总是使用花括号。

示例:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main() {
int score = 85;
if (score >= 60) {
printf("恭喜你,考试及格了!\n");
}
printf("程序继续执行...\n");
return 0;
}

输出:

恭喜你,考试及格了!
程序继续执行...

3.2. if...else 语句

语法:

if (条件表达式) {
// 当条件表达式为真时执行的代码块
} else {
// 当条件表达式为假时执行的代码块
}

说明: if...else 结构提供了二选一的逻辑。如果条件为真,执行 if 后面的代码块;否则(条件为假),执行 else 后面的代码块。两者必选其一。

示例:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main() {
int age = 17;
if (age >= 18) {
printf("你已经成年,可以投票了。\n");
} else {
printf("你还未成年,不能投票。\n");
}
return 0;
}

输出:

你还未成年,不能投票。

3.3. if...else if...else 语句(多重条件判断)

语法:

if (条件表达式1) {
// 如果条件表达式1为真,执行此代码块
} else if (条件表达式2) {
// 如果条件表达式1为假,且条件表达式2为真,执行此代码块
} else if (条件表达式3) {
// 如果前两个条件都为假,且条件表达式3为真,执行此代码块
} else {
// 如果以上所有条件都为假,执行此代码块 (可选)
}

说明:这种形式用于处理多个互斥的条件。程序会从上到下依次检查条件,一旦某个条件为真,其对应的代码块被执行,然后整个 if...else if...else 结构就会结束,跳过后续的 else ifelse。最后的 else 块是可选的,用于处理所有条件都不满足的情况。

示例:

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

int main() {
int grade = 75;
if (grade >= 90) {
printf("你的成绩是 A。\n");
} else if (grade >= 80) {
printf("你的成绩是 B。\n");
} else if (grade >= 70) {
printf("你的成绩是 C。\n");
} else if (grade >= 60) {
printf("你的成绩是 D。\n");
} else {
printf("你的成绩是 F,需要努力!\n");
}
return 0;
}

输出:

你的成绩是 C。

3.4. 嵌套 if 语句

你可以在一个 ifelse 块内部再包含另一个 if 语句,形成嵌套结构。

示例:

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

int main() {
int num1 = 10;
int num2 = 5;
if (num1 > 0) {
printf("num1 是正数。\n");
if (num2 > 0) {
printf("num2 也是正数。\n");
} else {
printf("num2 不是正数。\n");
}
} else {
printf("num1 不是正数。\n");
}
return 0;
}

输出:

num1 是正数。
num2 也是正数。

注意事项:

条件表达式:非零即真,零即假。例如,if (1) 永远为真,if (0) 永远为假。

悬空 else 问题 :当存在多个 if 语句和 else 语句时, else 总是与其前面最近的未匹配的 if 匹配。使用花括号可以消除歧义。

比较运算符: == (等于), != (不等于), > (大于), < (小于), >= (大于等于), <= (小于等于)。

逻辑运算符: && (逻辑与), || (逻辑或), ! (逻辑非)。它们用于组合更复杂的条件。

掌握 if 语句是编程的入门砖,它能让你编写出有“智慧”的程序,能够根据不同的情况做出不同的反应。

💻 配套习题

第一题 (选择题)

以下关于C语言 if 语句的描述,哪一项是错误的?

A. if 语句可以根据条件表达式的真假来决定是否执行某个代码块。

B. 在 if 语句中,条件表达式的值为非零时被认为是真。

C. else 关键字总是与它最近的、未被其他 else 匹配的 if 语句配对。

D. if 语句只能判断整数类型的条件。

第二题 (填空题)

请补全下面的C语言代码,使得当变量 x 的值大于 10 且小于 20 时,程序会输出 “x在10到20之间”。

#include <stdio.h>
int main() {
int x = 15;
if (x ____ 10 ____ x ____ 20) {
printf("x在10到20之间\n");
}
return 0;
}

第三题 (代码输出题)

阅读下面的C代码,并写出其输出结果:

#include <stdio.h>
int main() {
int a = 5;
int b = 10;
if (a > b) {
printf("A\n");
} else if (a == b) {
printf("B\n");
} else {
printf("C\n");
}
return 0;
}

第四题 (编程题)

编写一个C程序,要求用户输入一个整数。如果输入的整数是偶数,则输出 “你输入的是偶数。”;如果是奇数,则输出 “你输入的是奇数。”。

第五题 (编程题)

编写一个C程序,模拟一个简单的学生成绩评级系统。程序应接收用户输入的百分制成绩(0-100的整数),并根据以下规则输出对应的等级:

90-100:A

80-89:B

70-79:C

60-69:D

0-59:F

习题讲解

第一题 (选择题)

题目: 以下关于C语言 if 语句的描述,哪一项是错误的?

A. if 语句可以根据条件表达式的真假来决定是否执行某个代码块。

B. 在 if 语句中,条件表达式的值为非零时被认为是真。

C. else 关键字总是与它最近的、未被其他 else 匹配的 if 语句配对。

D. if 语句只能判断整数类型的条件。

答案: D

讲解:

A 选项正确:这是 if 语句的核心功能,它就是用来实现条件分支的。

B 选项正确:在C语言中,非零值被视为逻辑真(true),零值被视为逻辑假(false)。这是C语言处理布尔逻辑的方式。

C 选项正确:这是C语言中“悬空 else”问题的规则, else 会向上匹配最近的 if。为了避免歧义,通常建议使用花括号 {} 明确代码块。

D 选项错误: if 语句的条件表达式可以是任何能够求值为整数(0或非0)的表达式。这包括关系表达式(如 a > b)、逻辑表达式(如 x > 0 && y < 10),这些表达式的结果是0或1。此外,浮点数也可以作为条件表达式,例如 if (some_double_value),此时如果 some_double_value0.0,则为假,否则为真。因此,说它“只能判断整数类型的条件”是不准确的。

第二题 (填空题)

题目: 请补全下面的C语言代码,使得当变量 x 的值大于 10 且小于 20 时,程序会输出 “x在10到20之间”。

#include <stdio.h>
int main() {
int x = 15;
if (x ____ 10 ____ x ____ 20) {
printf("x在10到20之间\n");
}
return 0;
}

答案: >&&<

讲解:

x 大于 10,所以第一个空应该填 >

x 小于 20,所以第三个空应该填 <

题目要求 x 既要大于 10 又要小于 20 ,这表示两个条件必须同时满足。在C语言中,表示“同时满足”的逻辑运算符是逻辑与 &&。 所以完整的条件是 x > 10 && x < 20

第三题 (代码输出题)

题目: 阅读下面的C代码,并写出其输出结果:

#include <stdio.h>
int main() {
int a = 5;
int b = 10;
if (a > b) {
printf("A\n");
} else if (a == b) {
printf("B\n");
} else {
printf("C\n");
}
return 0;
}

答案: C

讲解:

首先,程序初始化 a5

b10

进入 if 语句:

第一个条件 a > b (即 5 > 10) 为假 (false)。

因此跳过第一个 printf("A\n");,进入 else if

检查 else if 的条件 a == b (即 5 == 10 ) 为假 (false)。

因此跳过 printf("B\n");,进入 else

因为前面的所有条件都为假,所以执行 else 块中的代码。

执行 printf("C\n");

程序输出 C ,然后换行,最后结束。

第四题 (编程题)

题目: 编写一个C程序,要求用户输入一个整数。如果输入的整数是偶数,则输出 “你输入的是偶数。”;如果是奇数,则输出 “你输入的是奇数。”。

参考代码:

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

int main() {
int num;
printf("请输入一个整数: ");
scanf("%d", &num); // 读取用户输入的整数

// 判断奇偶数:一个数对2取模,如果余数为0则是偶数,否则是奇数
if (num % 2 == 0) {
printf("你输入的是偶数。\n");
} else {
printf("你输入的是奇数。\n");
}

return 0;
}

讲解:

#include <stdio.h>:包含标准输入输出库,以便使用 printfscanf 函数。

int num;:声明一个整型变量 num 来存储用户输入的数字。

printf("请输入一个整数: ");:向用户显示提示信息。

scanf("%d", &num);:从标准输入读取一个整数,并将其存储到 num 变量中。 %d 是整数的格式控制符,&numnum 变量的地址。

if (num % 2 == 0):这是核心判断部分。

num % 2 使用 取模运算符 % 来计算 num 除以 2 的余数。

如果一个整数是偶数,它除以 2 的余数总是 0

== 0 检查余数是否等于 0

printf("你输入的是偶数。\n");:如果条件为真(即 num 是偶数),则执行此语句。

else { printf("你输入的是奇数。\n"); }:如果条件为假(即 num 不是偶数,那么它一定是奇数),则执行 else 块中的语句。

return 0;:表示程序成功执行。

第五题 (编程题)

题目: 编写一个C程序,模拟一个简单的学生成绩评级系统。程序应接收用户输入的百分制成绩(0-100的整数),并根据以下规则输出对应的等级:

90-100:A

80-89:B

70-79:C

60-69:D

0-59:F

参考代码:

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 score;
printf("请输入你的百分制成绩 (0-100): ");
scanf("%d", &score);

// 首先检查输入的成绩是否有效
if (score < 0 || score > 100) {
printf("无效的成绩!成绩必须在0到100之间。\n");
} else if (score >= 90) { // 90-100
printf("你的等级是: A\n");
} else if (score >= 80) { // 80-89 (因为前面已经排除了 >=90 的情况)
printf("你的等级是: B\n");
} else if (score >= 70) { // 70-79
printf("你的等级是: C\n");
} else if (score >= 60) { // 60-69
printf("你的等级是: D\n");
} else { // 0-59
printf("你的等级是: F\n");
}

return 0;
}

讲解:

#include <stdio.h>:标准输入输出库。

int score;:声明一个整型变量 score 来存储用户输入的成绩。

用户输入:通过 printf 提示用户,并使用 scanf 读取成绩。

成绩有效性检查:

if (score < 0 || score > 100):这是一个关键的边界条件检查。使用逻辑或 || 运算符,如果成绩小于0或者大于100,都认为是无效输入,并给出提示。

重要性:这个检查应该放在最前面,因为它处理的是所有后续逻辑的前提——有效的输入。

多重 else if 结构:

else if (score >= 90):如果成绩大于或等于90,则评为A。由于 if...else if 的执行特性,一旦这个条件满足,后续的 else if 块就不会再被检查和执行。

else if (score >= 80):如果上面的条件(score >= 90)不满足,并且 score 大于或等于80,则评为B。这意味着 score 的实际范围是 80 到 89。

以此类推, score >= 70 意味着 70 到 79,score >= 60 意味着 60 到 69。

else { printf("你的等级是: F\n"); }:如果前面所有的 ifelse if 条件都不满足,那么成绩一定在 0 到 59 之间(因为我们已经排除了小于0的无效成绩),所以评为F。

return 0;:程序正常退出。

这个题目很好地展示了 if...else if...else 结构在处理多重互斥条件时的应用,以及在编程中进行输入验证的重要性。

希望这些讲解和习题能帮助你更好地理解和掌握C语言的 if 选择结构!继续努力,编程的世界充满乐趣!🚀