目录
一、条件分支语句:if 和 else
1、if 语句
基本语法
if 语句的基本语法形式如下:
if (表达式)
语句
执行流程
-
首先计算表达式的值
-
如果表达式结果为非0(真),则执行后面的语句
-
如果表达式结果为0(假),则跳过该语句
在C语言中,0表示假,任何非0值都表示真。
示例:判断奇数
#include <stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
流程图

2、if-else 语句
基本语法
当需要处理两种对立情况时,可以使用if-else语句:
if (表达式)
语句1
else
语句2
示例:判断奇偶数
#include <stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
练习:判断成年
#include <stdio.h>
int main() {
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
3、复合语句(代码块)
控制多条语句
默认情况下,if和else只能控制紧随其后的一条语句。如果需要控制多条语句,必须使用花括号 {} 将这些语句组合成复合语句(也称为代码块)。
错误示例:
#include <stdio.h>
int main() {
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年了\n"); // 只有这条受if控制
printf("可以谈恋爱了\n"); // 这条总是会执行
return 0;
}
上面的代码,你会发现输入的值不管是>=18还是<18,“可以谈恋爱了”都可以打印到屏幕上。

正确写法:
#include <stdio.h>
int main() {
int age = 0;
scanf("%d", &age);
if(age >= 18) {
printf("成年了\n");
printf("可以谈恋爱了\n");
}
return 0;
}
这是因为 if 语句只能控制紧随其后的单条语句,即 printf("成年了\n");。当条件为真时执行该语句,为假时则跳过。而 printf("可以谈恋爱了\n"); 是独立存在的,无论 if 条件真假都会执行。若要让 if 语句同时控制多条语句,需要用大括号 {} 将这些语句括起来形成一个代码块,else 后面同样可以跟上大括号来实现相同的控制效果。
完整示例
#include <stdio.h>
int main() {
int age = 0;
scanf("%d", &age);
if(age >= 18) {
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else {
printf("未成年\n");
printf("不可以早恋哦\n");
}
return 0;
}
4、关键点总结
-
if语句用于条件判断,表达式为真时执行相应语句
-
if-else语句处理两种对立情况
-
使用花括号
{}可以将多条语句组合成复合语句,使其作为一个整体受条件控制 -
在C语言中,0表示假,任何非0值都表示真
-
良好的代码风格:即使只有一条语句,也建议使用花括号,提高代码可读性和可维护性
二、嵌套if语句
1、基本概念
在C语言中,else语句可以与另一个if语句连用,形成多重判断结构,这称为嵌套if语句。这种结构允许程序进行更复杂的条件判断。
2、基本示例
示例1:判断数字性质
#include <stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if(num == 0) {
printf("输入的数字是0\n");
}
else if(num > 0) { // 这里的if嵌套在else语句中
printf("输入的数字是正数\n");
}
else {
printf("输入的数字是负数\n");
}
return 0;
}
示例2:判断正数的奇偶性
#include <stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if(num > 0) {
// 嵌套的if语句判断奇偶
if(num % 2 == 0) {
printf("偶数\n");
}
else {
printf("奇数\n");
}
}
else {
printf("非正数\n");
}
return 0;
}
3、练习:年龄分段
编写程序,根据输入的年龄输出对应的年龄段:
-
<18岁:"少年"
-
18-44岁:"青年"
-
45-59岁:"中老年"
-
60-89岁:"老年"
-
≥90岁:"老寿星"
解决方案1:简洁写法
#include <stdio.h>
int main() {
int age = 0;
scanf("%d", &age);
if(age < 18) {
printf("少年\n");
}
else if(age <= 44) {
printf("青年\n");
}
else if(age <= 59) {
printf("中老年\n");
}
else if(age <= 89) {
printf("老年\n");
}
else {
printf("老寿星\n");
}
return 0;
}
解决方案2:显式嵌套写法
#include <stdio.h>
int main() {
int age = 0;
scanf("%d", &age);
if(age < 18) {
printf("少年\n");
}
else {
if(age <= 44) {
printf("青年\n");
}
else {
if(age <= 59) {
printf("中老年\n");
}
else {
if(age <= 89) {
printf("老年\n");
}
else {
printf("老寿星\n");
}
}
}
}
return 0;
}
三、悬空else问题
1、问题描述
在多个if和else语句中,else总是与最近的if匹配,这可能导致逻辑上的误解,称为"悬空else"问题。
2、示例分析
#include <stdio.h>
int main() {
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
运行结果:无输出

3、原因解释
实际上,代码的等价形式是:
#include <stdio.h>
int main() {
int a = 0;
int b = 2;
if(a == 1) {
if(b == 2) {
printf("hehe\n");
}
else {
printf("haha\n");
}
}
return 0;
}
这就是悬空 else 的问题。当存在多个 if 和 else 时,需要记住一个重要规则:else 总是与最近的 if 匹配。
上面的代码排版中,else 与第一个 if 对齐,容易让人误以为它们是一对。当第一个 if 条件不成立时,我们可能会认为会执行 else 子句输出"haha"。但实际上,这个 else 是与第二个 if 匹配的,整个 if...else 结构是嵌套在第一个 if 中的。因此,如果第一个 if 条件不成立,嵌套的 if-else 语句根本不会执行,最终也就不会有任何输出。
4、解决方案
使用大括号明确匹配关系:
#include <stdio.h>
int main() {
int a = 0;
int b = 2;
if(a == 1) {
if(b == 2) {
printf("hehe\n");
}
}
else {
printf("haha\n");
}
return 0;
}
良好编程习惯:
-
始终使用大括号明确代码块
-
保持一致的缩进风格
-
复杂的条件判断考虑拆分为多个步骤或使用函数
5、最佳实践
#include <stdio.h>
int main() {
int a = 0;
int b = 2;
if(a == 1) {
if(b == 2) {
printf("hehe\n");
}
else {
printf("haha\n");
}
}
else {
printf("条件不满足\n");
}
return 0;
}
通过合理使用大括号和清晰的代码结构,可以避免悬空else问题,提高代码的可读性和可维护性。
4353

被折叠的 条评论
为什么被折叠?



