目录
4.2.3 for循环和while循环中break和continue的对比
1、C语言中的语句
什么是语句?C语言中由一个分号;隔开的就是一条语句。
C语句可以分为以下五类:
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
2、分支结构(选择结构)——if语句
if语句是最常用的选择结构。
if语句的基本形式有以下三种:
(1)单分支结构
(2)双分支结构
(3)多分支结构
2.1 单分支结构
2.1.1 语句结构
语法结构如下所示:
if(表达式)
语句;
2.1.2 说明
(1)如果表达式的结果为真,则语句执行。在C语言中0表示假,非0表示真。
(2)if或else后面默认只能控制一条语句,想让控制多条语句,就需要加上大括号,把多条语句放到一对大括号里。一对大括号叫一个代码块,其实就是一个逻辑,如下所示。
if(表达式)
{
语句1;
语句2;
语句3;
......
}
2.2 双分支结构
2.2.1 语句结构
if(表达式)
语句1;
else
语句2;
2.2.2 说明
(1)判断语句中有两个及以上的判断条件,则需要将这几个判断语句分开写,然后用&&或||进行连接。
2.3 多分支结构
2.3.1 语句结构
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
......
else if(表达式n-1)
语句n-1;
else
语句n;
2.3.3 说明
(1)多分支结构中,最后的else可以不要。
2.4 if语句的嵌套
if语句的嵌套时,会出现else的匹配问题:else跟它离得最近的if匹配,这才是else的正确的匹配方法,而不是它和哪个对齐就和那个匹配,这是错误的。造成else匹配问题的写法,叫做悬空else问题。代码的书写的方法和分割非常重要。详见《高质量C/C++变成指南及编码规范》
3、分支结构(选择结构)——switch语句
switch语句也是一种分支语句。常用于多分支的情况。
3.1 语句结构
switch(表达式)
{
case 常量表达式1:
语句体1;
(break;)
case 常量表达式2:
语句体2;
(break;)
……
case 常量表达式n:
语句体n;
(break;)
(default:
语句体n+1;)
}
3.2 说明
(1)switch的表达式中,case后面的括号内一定是整形常量表达式(不是变量,不是浮点型)。字符也可以。字符也属于整形变量的一种,因为字符底层存储的时候用的是字符的ASCII码。
(2)case语句没有顺序问题。
(3)switch后的表达式和case后面的值决定给了选择语句的入口,break决定了出口,跳出分支。每条语句后加上break这样才实现了真正的分支效果。当从某个case进入选择语句后,如果没有break阻止它停下来,它就会一直往下执行,直到把后面的case语句执行完。但是只要符合程序运行的逻辑,也可以去掉break。
(4)在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。break语句 的实际效果是把语句列表划分为不同的分支部分。
(5)当switch-case语句嵌套时,break跳出的是自己所在的switch语句。
3.3 default 子句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。 但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,把下面的标签 default: 写在任何一个 case 标签可以出现的位置。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
4、循环结构
C语言提供了以下3钟循环结构:
(1)用while语句。
(2)用do-while语句。
(3)用for语句。
4.1 while循环
我们已经掌握了,if语句:
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
4.1.1 while语法结构
while(表达式)
{
循环语句;
}
4.1.2 流程图
流程图含义:
Expr:判断表达式,0表示假,非0表示真。
Stmt:statement的缩写,语句的意思。
4.1.3 break和continue的作用
Break作用:在while循环中,break用于永久的终止循环。只要break被执行(不管是不是在if语句中),后面不管还要循环多少次,它都不循环了,就会停止了。while中的break是用于永久终止循环的。
Continue作用:在while循环中,continue的作用跳过本次循环continue后面的代码。直接去while后的判断部分,看是否进行下一次循环。continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳到while语句的判断部分。进行下一次循环的入口判断。
4.1.4 说明:
(1)While语句中影响到循环的因素:
- i的初始值是非常重要的,初始化部分
- 判断部分。
- 循环变量调整部分
While循环中这三个部分离得比较远,改动起来比较麻烦。for循环中将这三部分集中到一起,改起来比较方便。
4.2 For循环
4.2.1 For循环的语法结构
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1:初始化部分,用于初始化循环变量的。
表达式2:条件判断部分,用于判断循环何时终止。
表达式3:调整部分,用于循环条件的调整。
【注意】与while循环的做对比
4.2.2 流程图
For循环的特点是初始化部分只被执行一次。不管循环多少次,初始化只被执行一次。
4.2.3 for循环和while循环中break和continue的对比
While循环中的continue和for循环中的continue是不一样的,for循环中的continue是跳到调整部分,进行i++的调整,而while循环中的continue完全有可能跳过调整部分,导致程序出现死循环。
把break换成continue:
4.2.4 for语句的循环控制变量
建议:
(1)不可在for循环体内修改循环变量,防止for循环失去控制。
(2)建议for语句的循环变量的取值采用“前闭后开区间”写法。
对上面建议第一条进行解释:
下面程序出现死循环了:在循环体内改变循环变量,会使得循环发生意想不到的结果。所以不要在for循环的循环体内修改循环变量,防止for循环失去控制。
以下是没问题的,把调整部分完全调整到循环体内部。
4.2.5 for循环的变种
变种一:初始化部分、判断部分、调整部分三部分均可省略
for循环的三部分都可以省略,但是判断部分省略的话,判断部分恒为真,会使得程序死循环。
变种二:for循环的循环变量控制可以是多个变量。
4.3 do-while循环
4.3.1 do-while 语法结构
do
{
循环语句;
}while(表达式);
4.3.2 流程图
4.3.3 说明
(1)do-while语句的特点是循环至少执行一次,使用的场景有限,不经常使用。
(2)do-while和while语句类似,循环变量的++可能会写在后面,有可能被continue语句跳过去,造成死循环。。
(3)break的作用是跳出循环,不是跳过整个程序,如果是循环嵌套的话,一个break只能跳出一层循环。