C语言分支结构详解:掌握if语句与关系操作符
C语言往期系列文章目录
往期回顾:
- C语言入门:解锁基础概念,动手实现首个C程序
- C语言概念之旅:解锁关键字,字符,字符串的秘密,揭秘语句和注释,程序员的宝藏
- C语言基础入门:数据类型、变量声明与创建详解
- C操作符详解,深入探索操作符与字符串处理
- 揭秘C语言输入输出内幕:printf与scanf的深度剖析
文章目录
前言
C语言作为一门结构化的程序设计语言,其核心逻辑由顺序结构、选择结构(分支结构)和循环结构三大基础结构组成。这三种结构如同积木一般,能组合出任何复杂的程序逻辑。本文将重点解析分支结构的实现方式——if
语句和switch
语句,并深入探讨关系操作符的使用技巧,帮助大家掌握条件判断的核心机制。
一、分支结构:if语句
1. 基本语法
if
语句用于实现条件判断,其语法形式如下:
if (表达式)
语句;
执行逻辑:若表达式结果为非0(真),则执行语句;若为0(假),则跳过该语句。
我们说表达式如果为真,语句执行,表达式为假,语句不执行。而在C语言中,0为假,非0表示真,也就是表达式的结果如果是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;
执行逻辑:表达式为真时执行语句1,否则执行语句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;
}
练习题:
输入一个年龄,>=18岁就输出:成年,否则就输出:未成年
3. 多语句控制:代码块
默认情况下,if和else仅控制紧接的一条语句。若需执行多条语句,需用{}包裹形成代码块:
示例:
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
else
printf("未成年\n");
printf("最好不要谈恋爱\n");
return 0;
}
为什么会报错呢?因为if 和else语句都默认只控制一条语句。所以我们想控制多条语句就可以用一个大括号括起来。
if (age >= 18)
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else
{
printf("未成年\n");
printf("最好不要谈恋爱\n");
}
由这个大括号括起来的语句,叫复合语句,代码块。
4. 嵌套if语句
复杂逻辑需通过嵌套if实现分层判断。
示例1:要求输入一个整数,判断输入的整数是0,还是正数或者负数。
if (num > 0)
printf("正数\n");
else if (num < 0)
printf("负数\n");
else
printf("零\n");
这是一种逻辑,当然我们也可以去使用嵌套if
if (num == 0)
{
printf("输入的数字是0\n");
}
else
{
if (num > 0)
{
printf("输入的数是正数\n");
}
else
{
printf("输入的数是负数\n");
}
}
示例2:要求输入⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出不是整数。
if (num > 0)
{
if (num % 2 == 1)
printf("奇数\n");
else
printf("偶数\n");
}
else
{
printf("非正数\n");
}
练习题:
输入一个人的年龄
如果年龄<18岁,打印“少年”
如果年龄在18岁至44岁打印“青年”
如果年龄在45岁至59岁打印“中老年”
如果年龄在68岁至89岁打印“老年”
如果90岁以上打印“老寿星”
5. 悬空else问题
代码陷阱:else
始终与最近的未匹配if
配对,而非依赖缩进。
下述代码的输出结果是什么?
#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;
}
很多初学者,上来以判断 a 是0,不等于1,那就执行 else 子句,打印 haha 但是当你去运行代码,输出的结果是:啥都不输出。
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。 上面的代码排版,让 else 和第⼀个 if 语句对齐,让我们以为 else 是和第⼀个if匹配的, *当 if语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第二个 if 进行匹配的,这样后边的 if…else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。
#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;
}
只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。
二、关系操作符
1. 操作符类型
C语言提供6种关系操作符用于比较运算:
操作符 | 含义 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 相等 |
!= | 不相等 |
2. 使用注意
返回值:关系表达式返回1(真)或0(假)。
易错点:混淆==(判断相等)与=(赋值)。
if (a = 5)
{ ... } // 错误!将5赋值给a,表达式恒为真
if (a == 5)
{ ... } // 正确判断
另⼀个需要避免的错误是:多个关系运算符不宜连用。
上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。
(i < j) < k
也就是 i 和 j 先比,比完后的结果再和k比。想要判断变量 j的值是否在 i 和 k 之间,应该使用下面的写法
i < j && j < k