C语言控制结构(条件语句)

控制结构是编程语言中用来控制程序执行流程的语句。条件语句允许程序根据不同的条件执行不同的代码块,这是实现程序逻辑判断的基础。本文将详细介绍C语言中的各种条件语句及其应用。

if语句

基本if语句

if语句是最基本的条件语句,用于在条件为真时执行特定的代码块。

1
2
3
4
// 基本语法
if (条件表达式) {
// 条件为真时执行的代码
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main() {
int age = 18;

if (age >= 18) {
printf("你已经成年了!\n");
}

// 单行语句可以省略大括号(但不推荐)
if (age >= 18)
printf("可以投票了!\n");

return 0;
}

if-else语句

if-else语句提供了两个执行路径:条件为真时执行一个代码块,条件为假时执行另一个代码块。

1
2
3
4
5
6
// 基本语法
if (条件表达式) {
// 条件为真时执行的代码
} else {
// 条件为假时执行的代码
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main() {
int score = 85;

if (score >= 60) {
printf("恭喜你,考试通过了!\n");
printf("你的分数是:%d\n", score);
} else {
printf("很遗憾,考试没有通过。\n");
printf("你的分数是:%d,需要达到60分\n", score);
}

return 0;
}

if-else if-else语句

当需要检查多个条件时,可以使用if-else if-else结构。

1
2
3
4
5
6
7
8
9
10
// 基本语法
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件2为真时执行
} else if (条件3) {
// 条件3为真时执行
} else {
// 所有条件都为假时执行
}
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 score = 85;

if (score >= 90) {
printf("优秀!等级:A\n");
} else if (score >= 80) {
printf("良好!等级:B\n");
} else if (score >= 70) {
printf("中等!等级:C\n");
} else if (score >= 60) {
printf("及格!等级:D\n");
} else {
printf("不及格!等级:F\n");
}

printf("你的分数是:%d\n", score);

return 0;
}

嵌套if语句

可以在if语句内部再使用if语句,这称为嵌套if语句。

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 = 20;
int has_license = 1; // 1表示有驾照,0表示没有

if (age >= 18) {
printf("年龄符合要求\n");

if (has_license) {
printf("有驾照,可以开车!\n");
} else {
printf("没有驾照,不能开车!\n");
}
} else {
printf("年龄不够,不能开车!\n");
}

return 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
25
26
27
28
29
30
31
#include <stdio.h>

int main() {
int temperature = 25;
int is_sunny = 1;
int is_weekend = 0;

printf("今日天气决策系统\n");

if (temperature > 20) {
printf("温度适宜(%d°C)\n", temperature);

if (is_sunny) {
printf("阳光明媚\n");

if (is_weekend) {
printf("建议:去公园野餐!\n");
} else {
printf("建议:午休时间到户外走走\n");
}
} else {
printf("天气阴沉\n");
printf("建议:室内活动\n");
}
} else {
printf("温度较低(%d°C)\n", temperature);
printf("建议:在家休息,注意保暖\n");
}

return 0;
}

switch语句

switch语句用于根据变量的值选择执行不同的代码块,特别适合处理多个离散值的情况。

基本switch语句

1
2
3
4
5
6
7
8
9
10
11
12
// 基本语法
switch (表达式) {
case1:
// 代码块1
break;
case2:
// 代码块2
break;
default:
// 默认代码块
break;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>

int main() {
int day = 3;

printf("今天是星期");
switch (day) {
case 1:
printf("一\n");
break;
case 2:
printf("二\n");
break;
case 3:
printf("三\n");
break;
case 4:
printf("四\n");
break;
case 5:
printf("五\n");
break;
case 6:
printf("六\n");
break;
case 7:
printf("日\n");
break;
default:
printf("输入错误!\n");
break;
}

return 0;
}

break语句的重要性

如果忘记写break语句,程序会继续执行下一个case,这称为”fall-through”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>

int main() {
int grade = 'B';

printf("没有break的情况:\n");
switch (grade) {
case 'A':
printf("优秀!\n");
case 'B':
printf("良好!\n");
case 'C':
printf("中等!\n");
case 'D':
printf("及格!\n");
default:
printf("评级完成\n");
}

printf("\n有break的情况:\n");
switch (grade) {
case 'A':
printf("优秀!\n");
break;
case 'B':
printf("良好!\n");
break;
case 'C':
printf("中等!\n");
break;
case 'D':
printf("及格!\n");
break;
default:
printf("评级完成\n");
break;
}

return 0;
}

利用fall-through特性

有时候fall-through特性是有用的:

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

int main() {
char ch = 'a';

switch (ch) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
printf("'%c' 是元音字母\n", ch);
break;
default:
printf("'%c' 是辅音字母\n", ch);
break;
}

return 0;
}

复杂switch示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>

int main() {
int choice;
float num1, num2, result;

printf("简单计算器\n");
printf("1. 加法\n");
printf("2. 减法\n");
printf("3. 乘法\n");
printf("4. 除法\n");
printf("请选择操作(1-4):");
scanf("%d", &choice);

printf("请输入两个数字:");
scanf("%f %f", &num1, &num2);

switch (choice) {
case 1:
result = num1 + num2;
printf("%.2f + %.2f = %.2f\n", num1, num2, result);
break;
case 2:
result = num1 - num2;
printf("%.2f - %.2f = %.2f\n", num1, num2, result);
break;
case 3:
result = num1 * num2;
printf("%.2f * %.2f = %.2f\n", num1, num2, result);
break;
case 4:
if (num2 != 0) {
result = num1 / num2;
printf("%.2f / %.2f = %.2f\n", num1, num2, result);
} else {
printf("错误:除数不能为零!\n");
}
break;
default:
printf("无效的选择!\n");
break;
}

return 0;
}

条件运算符(三元运算符)

条件运算符是if-else语句的简化形式,适用于简单的条件判断。

1
// 语法:条件 ? 表达式1 : 表达式2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int main() {
int a = 10, b = 20;

// 使用条件运算符找最大值
int max = (a > b) ? a : b;
printf("最大值:%d\n", max);

// 等价的if-else语句
int max2;
if (a > b) {
max2 = a;
} else {
max2 = b;
}
printf("最大值(if-else):%d\n", max2);

// 嵌套使用条件运算符
int c = 15;
int max_of_three = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
printf("三个数的最大值:%d\n", max_of_three);

// 条件运算符用于输出
int score = 75;
printf("结果:%s\n", (score >= 60) ? "及格" : "不及格");

return 0;
}

逻辑运算符在条件语句中的应用

逻辑与(&&)

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

int main() {
int age = 25;
int income = 50000;

// 同时满足多个条件
if (age >= 18 && age <= 65 && income >= 30000) {
printf("符合贷款条件\n");
} else {
printf("不符合贷款条件\n");
}

return 0;
}

逻辑或(||)

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

int main() {
char grade = 'A';

// 满足任一条件即可
if (grade == 'A' || grade == 'B' || grade == 'C') {
printf("成绩良好\n");
} else {
printf("需要努力\n");
}

return 0;
}

逻辑非(!)

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

int main() {
int is_logged_in = 0; // 0表示未登录

if (!is_logged_in) {
printf("请先登录\n");
} else {
printf("欢迎使用系统\n");
}

return 0;
}

实际应用示例

示例1:学生成绩管理系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>

int main() {
float score;
char name[50];

printf("请输入学生姓名:");
scanf("%s", name);
printf("请输入成绩:");
scanf("%f", &score);

printf("\n学生:%s\n", name);
printf("成绩:%.1f\n", score);

// 成绩有效性检查
if (score < 0 || score > 100) {
printf("错误:成绩应在0-100之间!\n");
return 1;
}

// 等级判定
if (score >= 90) {
printf("等级:A(优秀)\n");
printf("奖励:获得奖学金\n");
} else if (score >= 80) {
printf("等级:B(良好)\n");
printf("评价:表现良好,继续努力\n");
} else if (score >= 70) {
printf("等级:C(中等)\n");
printf("评价:还有提升空间\n");
} else if (score >= 60) {
printf("等级:D(及格)\n");
printf("评价:刚好及格,需要加强学习\n");
} else {
printf("等级:F(不及格)\n");
printf("建议:需要重修课程\n");
}

return 0;
}

示例2:ATM机操作模拟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>

int main() {
int choice;
float balance = 1000.0; // 初始余额
float amount;
int pin = 1234;
int input_pin;

printf("欢迎使用ATM机\n");
printf("请输入PIN码:");
scanf("%d", &input_pin);

if (input_pin != pin) {
printf("PIN码错误,访问被拒绝!\n");
return 1;
}

printf("\nPIN码正确,欢迎使用!\n");
printf("请选择操作:\n");
printf("1. 查询余额\n");
printf("2. 存款\n");
printf("3. 取款\n");
printf("4. 退出\n");
printf("请输入选择(1-4):");
scanf("%d", &choice);

switch (choice) {
case 1:
printf("当前余额:%.2f元\n", balance);
break;
case 2:
printf("请输入存款金额:");
scanf("%f", &amount);
if (amount > 0) {
balance += amount;
printf("存款成功!当前余额:%.2f元\n", balance);
} else {
printf("存款金额必须大于0!\n");
}
break;
case 3:
printf("请输入取款金额:");
scanf("%f", &amount);
if (amount > 0) {
if (amount <= balance) {
balance -= amount;
printf("取款成功!当前余额:%.2f元\n", balance);
} else {
printf("余额不足!当前余额:%.2f元\n", balance);
}
} else {
printf("取款金额必须大于0!\n");
}
break;
case 4:
printf("谢谢使用,再见!\n");
break;
default:
printf("无效选择!\n");
break;
}

return 0;
}

常见错误和注意事项

1. 赋值与比较的混淆

1
2
3
4
5
6
7
8
9
10
11
int x = 5;

// 错误:使用赋值而不是比较
if (x = 10) { // 这是赋值!
printf("这总是会执行\n");
}

// 正确:使用比较运算符
if (x == 10) {
printf("x等于10\n");
}

2. 浮点数比较的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float a = 0.1 + 0.2;
float b = 0.3;

// 可能不相等,由于浮点数精度问题
if (a == b) {
printf("相等\n");
} else {
printf("不相等\n");
}

// 正确的浮点数比较方法
float epsilon = 0.000001;
if (fabs(a - b) < epsilon) {
printf("近似相等\n");
}

3. switch语句中忘记break

1
2
3
4
5
6
7
8
9
// 错误示例
switch (grade) {
case 'A':
printf("优秀\n");
// 忘记break,会继续执行下面的case
case 'B':
printf("良好\n");
break;
}

4. 条件表达式的逻辑错误

1
2
3
4
5
6
7
8
9
10
11
int age = 25;

// 错误:逻辑错误
if (age > 18 && age < 18) { // 不可能同时满足
printf("这永远不会执行\n");
}

// 正确:
if (age >= 18 && age <= 65) {
printf("工作年龄\n");
}

总结

条件语句是程序控制流程的重要工具。通过本文的学习,你应该掌握:

  1. if语句:基本的条件判断
  2. if-else语句:二选一的条件执行
  3. if-else if-else语句:多条件判断
  4. 嵌套if语句:复杂条件的处理
  5. switch语句:多值选择的高效处理
  6. 条件运算符:简单条件的简化写法
  7. 逻辑运算符:复杂条件的组合

在实际编程中,要注意:

  • 合理选择条件语句的类型
  • 避免常见的语法错误
  • 注意代码的可读性和逻辑性
  • 处理边界条件和异常情况

掌握这些知识将为学习循环结构和编写更复杂的程序逻辑打下坚实的基础。

版权所有,如有侵权请联系我