【C语言初阶】分支语句 —— if语句
文章目录
【C语言初阶】分支语句 —— if语句二、分支语句(选择结构)1 选择 - 流程图2 `if` 语句2.1 语法结构2.2 不同结构的 `if` 语句2.2.1 `if` 单分支结构2.2.2 `if` 多分支结构2.2.3 `if` 多条件结构 2.3 说明2.4 悬空 `else`2.4.1 示例12.4.2 示例2 2.5 `if` 不同书写形式的对比2.5.1 示例12.5.2 示例2 2.6 `if` 语句练习2.6.1 练习12.6.2 练习2 总结:
二、分支语句(选择结构)
每个人的一生中都会面临无数的选择,而一旦确定了某个选择,那便不断地努力前行。
本章学习的 if 语句和 switch 语句,都是用来实现程序流程的选择性分支的,因此统称为选择语句(selection statement)。
1 选择 - 流程图

2 if 语句
if 语句被称为分支语句或选择语句,因为它相当于一个交叉点,程序要在两条分支中选择一条执行。
2.1 语法结构
//if单分支结构if(表达式)语句;//if多分支结构if(表达式)语句1;else语句2;//if多条件结构if(表达式1)语句1;else if(表达式2)语句2;else语句3; 说明:
1 if(表达式) 语句;
表达式求值判断一次,为真时执行语句,为假时什么也不执行。
2 if(表达式) 语句1; else 语句2;
表达式求值判断一次,为真时执行语句1,为假时执行语句2。
3 if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3;
先对表达式1进行判断,为真时执行语句2,为假时则对表达式2进行判断;如果表达式2为真,则执行语句2,如果表达式2为假,则执行语句3。
如果后续还有 else if(表达式) 的结构,则依然是先判断表达式,然后执行相应的语句或者继续进行后续表达式的判断。
注意1: else 后不跟表达式,只有 if 或者 else if 之后才能跟表达式。
注意2:语句可以是一条简单语句或复合语句。表达式为真说明其是非零值。
2.2 不同结构的 if 语句
2.2.1 if 单分支结构
单分支-流程图:

示例:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){//if单分支结构int age = 0;scanf("%d", &age);if (age < 18){printf("未成年!\n");}return 0;} 2.2.2 if 多分支结构
多分支-流程图:

示例:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){//if多分支结构int age = 0;scanf("%d", &age);if (age < 18){printf("未成年!\n");}else{printf("已成年!\n");}return 0;} 2.2.3 if 多条件结构
多分支-流程图:

示例:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){//if多条件结构int age = 0;scanf("%d", &age);if (age >= 0 && age < 18){printf("未成年\n");}else if (age >= 18 && age < 30){printf("青年\n");}else if (age >= 30 && age < 50){printf("中年\n");}else if (age >= 50 && age < 80){printf("老年\n");}else if (age >= 80){printf("老寿星\n");}return 0;} 2.3 说明
如果表达式的结果为真,则执行语句,否则就执行 if 语句后面的其他语句。
在C语言中,0表示假,非0表示真。
if 或者 else 后面只能跟随一条语句,当需要执行多条语句时,需要用 {} 大括号将它们括起来,形成复合语句。
if-else 语句可以嵌套使用,一个 if 语句内部可以包含其他 if 语句。
2.4 悬空 else
每个 else 只与和它最近的 if 相匹配,除非最近的 if 被花括号括起来。
2.4.1 示例1
代码示例:
#include<stdio.h>int main(){//悬空elseint a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");elseprintf("haha\n");//什么也不打印return 0;} 解释说明:
1 当程序执行到第一个 if 语句的位置时,进行表达式 a == 1 的求值和判断。
判断的结果为假,则不执行 if 内的语句,也就是不再对第二个 if 语句的条件表达式进行求值和判断。
本程序中的 else 与第二个 if 相匹配,而不是第一个 if ,所以当第一个 if 的条件判断为假的时候,程序流会直接跳过第二个 if 和 else ,继续执行后续其他代码。
2 也就是说,else 只与和它最近的 if 相匹配,而不是和所谓的与之对齐的 if 匹配。
2.4.2 示例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");//打印haha}return 0;} 解释说明:
1 根据实际需求,可以在 if 和 else 之后添加大括号 {} ,使得程序变得更易读。
2.5 if 不同书写形式的对比
2.5.1 示例1
//代码1if (condition){return x;}return y;//代码2if (condition){return x;}else{return y;} 解释说明:
1 结论:两个代码执行效果相同,但代码2更加清楚易懂。
代码1:当 if 语句条件表达式判断为真时,执行 return x; 语句;表达式判断为假时,执行 if 语句之后的其他语句,也就是执行 return y; 。(一条 if 语句、一条 return 语句)
代码2:当 if 语句条件表达式判断为真时,执行 return x; 语句;表达式判断为假时,执行 return y; 语句。(一条 if 语句)
2.5.2 示例2
//代码1int num = 1;if (num == 5){printf("hehe\n");}//代码2int num = 1;if (5 == num){printf("hehe\n");} 解释说明:
1 结论:两个代码执行效果相同,但代码2更加清楚易懂。
代码1:在书写时,可能会出现 if (num = 5) 这样的情况,不小心漏掉了一个等号,将条件表达式由判断是否相等变成了判断一个赋值语句。
代码2:在书写时,如果出现 if (5 = num) 时,程序会报错,这样就很好的避免将条件语句中的判断相等写成赋值语句。
2 赋值表达式求值
对赋值语句判断的结果就是赋值运算符右操作数的结果,也就是将赋的值作为赋值表达式判断的结果。
2.6 if 语句练习
2.6.1 练习1
判断一个数是否为奇数
代码示例:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){//判断一个数是否是奇数int num = 0;scanf("%d", &num);//方法一//判断num%2的结果是否为1,为1表示是奇数,为0表示是偶数if (1 == num % 2)//%运算符的优先级高于==运算符{printf("%d是奇数.\n", num);}else{printf("%d是偶数.\n", num);}//方法二//判断num%2的结果是不是不等于0,如果不等于0则是奇数,为0则是偶数if (num % 2 != 0)//%运算符的优先级高于!=运算符{printf("%d是奇数.\n", num);}else{printf("%d是偶数.\n", num);}return 0;} 解释说明:
1 判断奇偶时,将目标数模2取余,结果为0表示偶数,结果为1表示奇数。
2.6.2 练习2
输出1~100之间的奇数
代码示例:
#include<stdio.h>int main(){//判断1~100之间的奇数//方法一//从1开始判断到100,是奇数就打印输出int i = 0;for (i = 1; i <= 100; i++)//循环了100次{if (i % 2 == 1)//判断了100次{printf("%d是奇数.\n", i);//执行了50次}}//方法二 //i每次加2,满足1~100中奇数的等差数列形式,公差为2for (i = 1; i < 100; i += 1)//循环了50次{printf("%d是奇数.\n", i);//执行了50次}return 0;} 解释说明:
1 写法一是判断1~100中的所有数,如果是奇数则打印。
2 写法二是直接打印1~100中的所有奇数,且不用作判断。
总结:
本节简单介绍了分支语句中的 if 语句,给出了三种形式的 if 语句;同时又讲解了什么是悬空 else 和 if 不同书写形式的对比。
感谢您的阅读!如有任何错误,欢迎您的批评指正!