C语言是一门结构化程序设计语言,如何理解这个结构化?对于生活中的任何事情都可以抽象为三种结构化的逻辑设计,主要为:顺序结构、分支结构、循环结构,这也是程序逻辑设计的重要思想,本篇博客重点详细总结分支语句,达到能够理解和运用。
目录
1.3 if语句的编写代码风格(更多代码风格参考《高质量c++编程》)
一、C语言语句类型
1、C语言语句类型
1.1 语句是什么?
在C语言中,语句是以分号结尾的字符序列,是程序最基本的执行单位,分号是C语句的必要组成部分。书写程序代码时,一行可以写几个语句,一个语句也可以写在多行上。C语句包含多种形式。
1.2 C语言的五类语句
1.2.1 表达式语句
包括算术、逻辑、关系、位运算等表达式,例如
x = y + z;
1.2.2 函数调用语句
用于执行函数,如
printf("Hello, World!");
1.2.3 复合语句(块语句)
由多个语句组成,用大括号
{ }
包围。
1.2.4 空语句
只有一个分号
;
,表示不执行任何操作。空语句就是我需要这个语句,但不要这个语句做任何事
1.2.5 控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
条件判断语句也叫分支语句:if语句、switch语句;
循环执行语句也叫循环语句:do while语句、while语句、for语句;
转向语句:break语句、continue语句、goto语句、return语句。
二、分支语句
当程序逻辑需要在多种情况进行选择执行时,就需要使用分支语句,C语言中分支语句主要有两种:if语句、switch语句,掌握好这两种语句至关重要!可以减少实际开发出错的机率,提高开发效率。
1、if 语句
1.1 if语句的基本语法结构
if语句分为单分支,双分支,多分支三种形式,如下所示。
如果语句中的表达式为真则执行语句,为假就不执行语句,在c语言中规定0为假非0为真。
if括号里的表达式是指是一个有值的式子。
1.1.1 单分支
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
return 0;
}
1.1.2 双分支
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
return 0;
}
双分支结构,可以使用三目运算符进行代替,方便实际开发
//采用双分支
if(a>b)
{
max = a;
}
else
{
max = b;
}
//采用三目运算符
max=a>b?a:b;
1.1.3 多分支
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(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
{
printf("老寿星\n");
}
return 0;
}
注意:如果条件成立,要执行多条语句,应该使用花括号括起来,表示一个代码块!单条语句可以不加。
1.2 悬空else
当使用if语句的双分支时我们一定要记住最重要的一点,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;
}
当看到以上代码时,我相信很多人会认为运行结果为打印"haha",其实当我们运行时,控制台什么也不输出,这就是上面我们说的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;
}
1.3 if语句的编写代码风格(更多代码风格参考《高质量c++编程》)
1.3.1 适当使用花括号{},代码逻辑更加清楚
在编码时,使用花括号的优点主要有两个,首先,这代表一个代码块,程序在执行是把它作为一个整体执行,减少出错;其次,可以使代码逻辑更加清晰,易于理解维护。
//代码1
if (condition)
{
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
1.3.2 整型变量与常量进行比较时,常量放在左边
整型变量与常量进行比较时,用的是两个等于号==,由于数学习惯如果只采用一个等于号=,这是赋值操作,会改变变量的值,而不会发生报错,不易于对程序进行报错检查,而整型变量与常量进行比较时,常量放在左边,如果只采用了一个等于号,编译器会强制报错要求更改,因为等号赋值左值必须是变量!而双等于号没有要求。
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
2、switch 语句
switch语句也可以作为一种分支语句,它有一个限制条件就是判断条件必须是整型表达式,有一定的适用范围。
2.1 switch语句的基本语法结构
而语句项是什么呢?
注意事项:
1、swtich后面的括号里必须是整型表达式/变量,变量的类型可以是:整型、字符型、枚举(字符型和枚举常量本质上也是整型值)。
2、case后面跟的是变量的所有取值!必须是整型!
3、case语句决定了分支的入口,break语句决定了分支的出口,二者结合使用才能达到分支的效果!
4、并不是说每个case语句必须有一个break语句,break语句的位置取决于实际的代码逻辑!
2.2 在switch语句中的 break
//代码1
#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;
}
当我输入了一个1,在没有break语句情况下,它将后面的都打印出来
//代码2
#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;
}
代码运行结果如下:
🔺注意:
在这里的break实现了在switch语句跳出分支的效果,如果没有break语句的话,他就会一直按着顺序一条一条语句执行。
因此,在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
#include <stdio.h>
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
有时候我们的需求变了
1.输入1-5,输出的是“weekday”2.输入6-7,输出“weekend”
所以我们的代码就应该像上面这样实现了,本质上就是一个双分支!break语句的实际效果是把语句列表划分为不同的分支部分!!!
编程好习惯!
在最后一个 case 语句的后面加上一条 break语句。
之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句。实际开发增加分支时,避免相互影响!
2.3 default 语句
如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结构就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default子句,把下面的标签default:写在任何一个 case 标签可以出现的位置。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置。其实就是处理输入的异常值,给用户一个提醒,方便反馈!
#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;
}
假如我们输入8,这时候没有case 8可以匹配,则会与default匹配输出default下的语句:
编程好习惯!
在每个switch语句中都放一条default子句是个好习惯,甚至可以在后面再加上一个break。
三:分支语句小结
以上便是详细总结的分支语句的全部内容,可以留下你们点赞、关注、评论,您的支持是对我极大的鼓励,下期再见!