【C语言初阶】分支语句 —— if语句
文章目录
二、分支语句(选择结构)
每个人的一生中都会面临无数的选择,而一旦确定了某个选择,那便不断地努力前行。
本章学习的 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()
{
//悬空else
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("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
//代码1
if (condition)
{
return x;
}
return y;
//代码2
if (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
//代码1
int num = 1;
if (num == 5)
{
printf("hehe\n");
}
//代码2
int 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中奇数的等差数列形式,公差为2
for (i = 1; i < 100; i += 1)//循环了50次
{
printf("%d是奇数.\n", i);//执行了50次
}
return 0;
}
解释说明:
1 写法一是判断1~100中的所有数,如果是奇数则打印。
2 写法二是直接打印1~100中的所有奇数,且不用作判断。
总结:
本节简单介绍了分支语句中的 if
语句,给出了三种形式的 if
语句;同时又讲解了什么是悬空 else
和 if
不同书写形式的对比。
感谢您的阅读!如有任何错误,欢迎您的批评指正!