目录
前言
C语言分支语句if,switch语句详细讲解篇!!!
C语言是结构化的程序设计语言
顺序结构
一般的语句就是按照的这个结构执行的。
选择结构(本篇博客所讲内容)
C语言用if,switch分支语句构成选择结构
循环结构
C语言用for,while,do..while三个语句构成循环结构。
if语句的语法结构
if接单语句的情况
if(条件表达式)
语句;
例子:输入n,如果n等于1,打印hello
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n == 1)// = 是赋值符号,条件表达式千万不要写成单个等号!!! 相等是两个等号 ==
printf("hello\n");
return 0;
}
测试结果:
说明:
if接单语句情况,满足条件表达式,就执行语句;不满足条件则不执行。
if接多语句的情况
if(条件表达式)
{
语句1;
语句2;
....
语句n;
}
例子:输入n,如果n等于1,打印hello和world
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n == 1)// = 是赋值符号,条件表达式千万不要写成单个等号!!! 相等是两个等号 ==
{
printf("hello\n");
printf("world\n");
}
return 0;
}
测试结果:
说明:
如果if语句后面接一个代码块(一个代码块如下图所示),满足条件表达式,就执行代码块的所有内容;不满足条件则不执行。
代码块实例:(有{}花括号括起来的就是代码块)
注意:单语句可以不加{},多语句必须加上{}。(个人建议不管单语句还是多语句,最好加上{})
条件表达式一定要注意不要写单个等号!!!!!!!!!
双分支
//每个分支单语句的情况
if(条件表达式)
语句1;
else
语句2;
//每个分支多语句的情况
if(条件表达式)
{
语句1;
语句2;
....
语句n;
}
else
{
语句1;
语句2;
....
语句n;
}
例子:输入n,如果n等于1,打印hello;否则打印bingo。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n == 1)// = 是赋值符号,条件表达式千万不要写成单个等号!!! 相等是两个等号 ==
{
printf("hello\n");
}
else
{
printf("bingo\n");
}
return 0;
}
测试结果:
说明:if else双分支的情况如果满足if的条件表达式,就执行if后面的单语句或者代码块;如果不满足if的条件表达式,则执行else后面的单语句或者代码块。
注意:单语句可以不加{},多语句必须加上{}。(个人建议不管单语句还是多语句,最好加上{})
条件表达式一定要注意不要写单个等号!!!!!!!!!
多分支
//每个分支单语句的情况
if(条件表达式1)
语句1;
else if(条件表达式2)
语句2;
......
else
语句n;
//每个分支多语句的情况
if(条件表达式1)
{
语句1;
语句2;
....
语句n;
}
else if(条件表达式2)
{
语句1;
语句2;
....
语句n;
}
....
else
{
语句1;
语句2;
....
语句n;
}
说明:遇到一个分支先判断条件表达式,如果满足,则执行该分支内容,其他分支就不用判断和执行了。如果不满足,则继续往下按顺序进行判断,如果列出的所有if和else if的条件表达式都不满足,则执行else分支的内容。
注意:单语句可以不加{},多语句必须加上{}。(个人建议不管单语句还是多语句,最好加上{})
条件表达式满足时结果为真,则语句执行。
在C语言中如何表示真假?
0表示假,非0表示真。
悬空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;
}
你以为测试结果是打印haha?其实不然,真正的结果是什么都没执行。
为什么会这样?如果没有{},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;
}
这也是为什么我建议大家无论如何都要加上{}!!!
注意:在一个if分支结构中,只能有一个else。
在一个if分支结构中,if可以单独存在。
在一个if分支结构中,可以没有else。
switch语句
switch语句也是一种分支语句。
常常用于多分支的情况。
语法:
switch(整型表达式)
{
语句项;
}
而语句项是什么呢?
case 整型常量表达式:
语句;
说明:这里case 整型常量表达式:,冒号:的后面,可以接多条语句,不用加上花括号{}。
在switch语句中的 break
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
假设我们要打印星期三,我们输入3,测试结果却不是我们想象的那样。
程序会把星期三往下的语句都打印了。
这就是没有break,switch语句的分支不能独立!!
每个case后面加上break的代码:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
测试结果:
总结:break语句 的实际效果是把语句列表划分为不同的分支部分。
编程好习惯
在最后一个 case 语句的后面加上一条 break语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
default子句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
比如之前的选星期几的代码,加上default之后
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default:
printf("输入错误!\n");
break;
}
return 0;
}
输入9的测试结果:
编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
写在最后
有错误的地方希望大家指出,有问题的也可以在评论区讨论。