思维导图
条件判断语句
在C语言中,条件判断语句用于设置判断条件并根据条件的满足情况来选择性执行特定的代码。
条件判断语句分为两种类型:if判断语句和switch判断语句。
if判断语句
if判断语句是一种分支选择结构,由if关键字、else关键字、括号中的表达式和一系列的else if语句组成。
if判断语句会依次判断每个条件,并根据条件的满足情况来选择执行相应的代码。
语法结构
单分支
if(表达式)
语句1;
else
语句2;
多分支
if(表达式1)
语句1;
else if(表达式2
语句2;
else
语句3;
表达式的值为0代表假,不执行判断语句;非0代表真,执行判断语句。
执行原理
- 首先,判断第一个条件是否为真。如果为真,则执行与该条件关联的代码块,并跳过后面的条件判断。
- 如果第一个条件为假,则继续判断第二个条件。如果第二个条件为真,则执行与该条件关联的代码块,并跳过后面的条件判断。
- 如果第二个条件为假,则继续判断后面的条件,依次进行下去,直到找到为真的条件。
- 如果没有任何条件为真,则执行与else语句关联的代码块(如果有的话)。
- 执行完与条件关联的代码块后,跳过其他分支的代码块,继续执行后面的代码。
switch判断语句
switch判断语句是一种多分支选择结构,由switch关键字、括号中的表达式和一系列的case标签组成。
根据整型表达式的值,switch语句会跳转至与该值匹配的case语句中执行相应的代码。
语法结构
switch(整型表达式)
{
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
default:
语句3;
break;
}
整型表达式的结果必须是整型或枚举常量。
执行原理
-
计算整型表达式的值。
-
根据表达式的值与case标签中的值进行匹配。如果匹配成功,则跳转到对应的语句执行。
-
如果所有case都没有匹配成功,且有default标签,则跳转到default标签处执行相应的代码。
-
如果没有default标签,则直接跳出switch语句,执行下一条语句。
对比两种分支
执行原理
if判断
从上到下依次判断条件,执行相应代码。
switch判断
跳转到匹配条件的case标签,执行相应代码。
break和default关键字
if判断
- if语句没有break和default关键字。
- 执行完一个条件的代码块后,不会执行其他条件的代码块,即自动结束整个if-else选择。
switch判断
-
break关键字,用于结束整个Switch选择。
-
break有打破的意思,可以打破当前Switch选择,而if选择不会顺序执行,只会执行一个条件的代码块,无需打破。
-
同时Switch选择中没有continue关键字,因为continue有继续的意思,做选择判断只需要做一次,而循环需要做多次。
-
-
default关键字用于匹配没有满足条件的情况。
-
如果当前case标签没有包含break关键字,会顺次执行后面其他case和default标签的代码块
-
如果所有case都没有匹配成功,且有default标签,则跳转到default标签处执行相应的代码
以下示例说明了上述规则:
int func(int a)
{
int b;
switch (a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
func(1);
输出为0。在该switch语句中,所有分支均没有使用break语句,因此会从上到下顺序执行,最后执行default中的语句并返回。
结构组成
if判断
else语句与最近的if语句匹配
以下示例说明了else语句与最近的if语句匹配的情况:
if()
if()
else
尽管else与外层if对齐,但实际上它会与内部if语句匹配。
if 和else之间不能有其他语句存在
以下示例中,在if和else语句之间有另一条语句存在,会导致编译错误:
if (0 == n || 1 == n)
{
return 1;
}
int num = 1; //错误
else
{
for (int i = 2; i <= n; i++)
{
num *= i; // num保存n以前的所有乘积项
}
}
两种if判断形式的对比
- 满足条件返回A,不满足返回B
// 不推荐
if(condition)
{
return A; //一旦有一个return执行,其后的语句都不会再执行
}
return B;
// 推荐
if(condition)
{
return A;
}
else
{
return B;
}
- 判断变量和常量是否相等
// 不推荐
if(num == 5)
// 推荐
if(5 == num)
switch判断
-
switch语句中的default子句可以放在任意位置,但最好放在最后。
-
switch语句中的case标签不需要按顺序编写,一般情况下,最好将case标签放在default之前。
以下示例说明了上述规则:
#include <stdio.h>
int main()
{
int x = 3;
int y = 3;
switch (x % 2) // x%2的结果为1,因此执行case1
{
case 1:
switch (y) // y是3,因此会执行case3,而case3不存在,那只能执行default
{
case 0:
printf("first");
case 1:
printf("second");
break;
default: printf("hello");
}// 打印hello,打印完之后,内部switch结束,此时外部case1结束
// 因为外部case1之后没有添加break语句,所以继续执行case2
case 2:
printf("third"); // 打印third
}// 外部switch结束
return 0;
}
首先,在内部switch语句的default位置输出hello,然后在外部case2中输出third。
使用场景
-
if 判断适用于条件比较复杂的判断。
-
switch 判断适用于条件是整型常量的判断。
总结
-
本文介绍了C语言中条件判断语句的作用以及两种常见的条件判断语句:if判断语句和switch判断语句。
-
详细讲解了它们的语法结构、执行原理以及用法上的一些注意点。
-
同时,对比了两者的执行原理、break和default关键字的使用,以及结构组成上的差异,通过示例代码进一步说明。