C语言结构及程序执行结构
文章目录
概述
任何一门高级语言,都有其语言的结构,并且具有建立在语言结构基础上的程序流程控制.因此下面将来介绍C语言的结构及程序流程控制.具体内容有:
- C语言结构
- C语言的语句
- C语言的程序流程控制
C语言的结构
C语言的结构从从不同的角度来看具有不同的结构
具体可以从数据角度和程序流程角度两个角度看待
数据角度
从数据角度来看,C语言的结构分为两部分:数据描述/数据输入/数据声明和数据操作
而数据描述和数据操作都是由C语言的语句所实现的.
数据流程角度
从程序流程角度来看,C语言的结构可以分为:顺序结构,选择结构,循环结构
每个结构的实现都是靠C语言的语句实现的
C语言的语句
前面提到,C语言的各种结构的基础都是C语言的语句,因此下面将对C语言的语句进行介绍.
实体语句
所谓的实体语句[^为便于理解,本人所创造的词],就是指与控制语句相对应的语句,具体如下:
表达式语句
表达式的后面加上一个分号就构成了表达式语句
前面所讲的算数表达式,关系表达式,逻辑表达式,赋值表达式等任何表达式后面加上分号就构成了表达式语句.
执行表达式语句就是计算表达式的值.
空语句
空语句又称空操作语句,只有一个分号,在程序执行过程中不做任何操作.
通常使用空语句是为了语法的完整性,例如:
while(getchar!='\n') ;
根据while的语法,在while后面需要加上一个语句才能让while循环完整,因此这里加上空语句,来满足语法的完整性;
复合语句
将多个语句用括号{}括起来组成的一个语句就是一个复合语句,复合语句的一般格式为:
{
语句1;
语句2;
语句3;
...
}
虽然从形式上看复合语句是多个语句的集合,但是他在语法意义上是一个整体,在程序设计中复合语句被当成一条语句进行处理
因此在这个角度下,for,while循环都可以拆成两部分,一个是循环控制部分,一个是执行部分.,而执行部分就是单独的一条语句.
需要说明的是:
- 复合语句内个语句都必须要以;结尾
- 符合语句内部声明的变量作用域在本复合语句内.
函数调用语句
函数调用语句是由函数名,实际参数列表组成的,以分号结尾.
函数名(实际参数表);
函数语句的作用就是将实际参数表的各个实际参数赋给对应的形式参数,然后执行函数中的语句,求取函数值.
控制语句
控制语句具体就是指在程序运行的过程中主要起控制作用的语句.控制语句根基作用的主次,又可以分为主要控制语句和辅助控制语句[^为了便于记忆本人命名的]
下面将分别对主要控制语句和辅助控制语句进行介绍
主要控制语句主要指在程序流程控制中起主要作用的语句.主要有以下几种:if…else…,for(),while(),do-while
辅助控制语句指在程序流程中起辅助作用的语句.主要有以下几种:continue,break,switch,goto,return
条件判断语句
条件判断语句分成两种:if…else…和switch{case}
if…else…是两路分支,switch…{case}是多路分支.
循环执行语句
循环执行语句有三种,分别是:for循环,while循环和do-while循环
for循环多用于已知循环次数,while和do-while多用于未知循环次数
转向语句
转向语句分为break,continue,return和goto四种
break语句
break语句用于是流程跳出当前循环或多路分支的复合语句.
for(i=1;i<=9;i++)
{
printf("这是第%d次循环",i);
break;
}
printf("1")
>>>这是第1次循环.1
从上面的例子中能看出,break语句跳出的是for语句后面的复合语句,继续执行整个for循环后面的语句.
for(i=1;i<=2;i++)
{
printf("这是外循环第%d次循环",i);
for(j=1,j<=9,j++){
printf("这是内循环第%d次",j);
if(j==2){
break;
}
}
}
>>>最后输出的结果内循环一直只循环两次
从上面的例子中能够看出,break跳出的是循环语句的复合语句,而不是判断语句的复合语句
continue语句
continue语句只用于循环语句,和break不同的是,break是直接跳出复合体进行循环语句进行循环语句的下一句,而continue则是结束本次循环语句,跳转到循环语句的开头,继续循环.
for(i=0;i<=3;i++)
{
if(i==2)
{
continue;
}
printf(i);
}
>>>013
goto语句
goto语句是无条件转移语句,主要作用是跳转到语句标号处.
for(i=1;i<=9;i++)
{
if(i==3)
{
goto JUMP_HERE
}
printf("这是第%d次循环",i);
}
JUMP_HERE:
printf("666");
>>>这是第1次循环,这是第2次循环,666
从上面的例子中,不难看出:
- 设置语句标号用 标号名 : 语句的格式
- 标号名遵从变量命名的一般格式.
因此goto可以直接用于跳出多层循环嵌套.
但是需要注意的是,goto会破话程序的结构型,尽量少用慎用.
return语句
关于return语句将放在介绍函数的章节介绍.
C语言的程序执行结构
一般的程序执行的结构有三种,分别是顺序结构,选择结构/分支结构和循环结构.
通过这三种结构,我们能够解决任何可编程解决的问题.
下面就将一一介绍这三种结构.
顺序结构
顺序结构是最简单,最基本的程序设计.
它由简单的语句组成,程序的执行是按照程序员书写的顺序惊醒的,没有分支,转移和循环.
每条语句都将按照从上到下的顺序依次执行
选择结构
由于顺序结构是按顺序执行的,无分支,无转移,无循环,因此他不可能处理复杂的问题.而在数据结构处理的过程中,往往需要根据不同的条件进行判断,然后选择分支进行运算.因此就有了选择结构.
选择结构可以分成两种,一个是if语句,一个是switch语句
if语句
if语句的格式如下
if(条件1)
{
语句1;
}
else if(语句2)
{
语句2;
}
...
else if(条件n)
{
语句n;
}
else
{
语句n+1;
}
需要说明的是:
- if的分支如下:
- if语句可以嵌套
- 当条件很多的时候一般选用switch,因此if语句通常使用if…else…
switch语句
if语句通常用于处理有两个分支或者三个分支的选择结构
但是当分支较多的时候,还使用if语句的话程序的可读性就太差了
这个时候就要用switch语句.
switch语句的语法如下:
switch(表达式)
{
case 常量1:语句组1;
case 常量2:语句组2;
...
case 常量n:语句组n;
default:语句组n+1;
}
需要说明的点如下:
-
switch语句在执行的时候,首先计算表达式的值,当表达式的值与某一个case后面的常量相等时,就去执行对应case后面的语句.如果都不匹配,就去执行default后面的语句
-
每个case后面的值要不一样,否则错误会产生
-
case和default的位置不会影响执行的结果
-
需要说明的是,switch语句中的某一个case后面的语句执行完之后,不在进行case的判断,而将以此执行剩下的case中的语句.即case常量表达式只起入口表示的作用.因此每一个case后面通常会加入break
-
多个case可以共用一个语句
scanf("%d",&month); switch(month) { case 1: case 2: case 3: day=30; break; case 4: if... else... break; default: break; }
循环结构
许多问题都会遇到规律性的重复操作,例如:求累加和,迭代问题等,还包括一些动态问题,例如动态输入,动态输出等.
因此需要使用循环结构.
循环结构是结构化程序设计的基本结构之一,他与顺序结构,选择结构共同构成了各种复杂的基本构造单元.
循环结构具体分成三种:while语句,do…while语句,for语句
下面将一一介绍
while语句
while语句的语法如下:
while(表达式)
{
循环语句
}
对于while语句说明如下:
-
while语句是先判断再执行
-
while语句执行的过程如下:
(1)先判断语句是否为0
(2)当表示式为0时,循环不执行;当表达式不为0时,先执行循环语句,然后在转到(1)继续执行 -
while可以嵌套使用
do-while语句
do-while语句是另外一种循环结构,它和while语句不同的点在于do-while是先执行语句,在再判断.
事实上所有do-while能够实现的功能,while语句也都能实现
do
{
循环语句
}
while(表达式)
for语句
while语句和do-while语句一般都是用于未知循环次数的循环
而for循环主要用于已知循环次数的循环,语句如下:
for(表达式1;表达式2;表达式3)
{
语句
}
这里说明几点:
- 表达式1用于初值设定,有时候为了多个初值的设定,可以用逗号隔开
- 表达式2是关系或者逻辑表达式,用于控制循环的条件
- 当表达式2省略的时候,认为真
- for语句可以嵌套