复合语句
在C语言中,用一对花括号“{ }”将若干条语句括起来成为一个语句组,称为复合语句,其一般形式如下:
{ 语句1; 语句2; 语句3;……; 语句n ; }
花括号内语句的数量、类型不限,可以是声明语句、赋值语句等;一个复合语句在语法上被视为一条语句。例如:
#include
main()
{ ……
{int a,b,c; /*变量a,b,c只能在此复合语句内使用*/
a=10; b=20;
c=a+b;
printf(“%d,%d,%d\n”,a,b,c);
}
…… }
注意,复合语句内的定义变量语句要出现在执行语句之前,且复合语句内定义的变量只能在该复合语句内部有效。
4.2 二分支选择结构
一、简单的二分支选择结构
C语言的if语句有两种基本形式。
1、独立if结构
(1)语法形式
if(表达式)
语句
其中,
①if是C语言的关键字;
②表达式可以是任意的表达式且一对圆括号不可缺省;
③语句可以是一条简单语句或复合语句。
(2)执行过程
首先计算表达式的值,然后根据其真假来决定程序的走向。若表达式为真(值为非零)则执行语句,若为假(值为零)则不执行语句。退出分支结构后程序继续执行if结构后面的语句。
图4.1 if结构流程图
(3)举例
if(a>b)
b++;
若a的初值为20,b的初值为10,则表达式(a>b)为真,执行语句“b++;”,则a的结果为20,b的结果为11。
若a的初值为10,b的初值为20,则表达式(a>b)为假,不执行语句“b++;”,则a和b均保留初值:10和20。
如果语句为复合语句,将以上程序段改为:
if(a>b)
{ b++;
a++; } 则,
若a的初值为20,b的初值为10,则表达式(a>b)为真,执行语句“b++;”和“a++;”, a的结果为21,b的结果为11。而若a的初值为10,b的初值为20,则表达式(a>b)为假,语句“b++;”和“a++;”均不被执行,a的结果仍为10,b的结果仍为20。若将复合语句的一对花括号去掉则程序段成为:
if(a>b)
b++;
a++;
此时,语句“a++;”已不再属于if结构,不管条件为真或为假,对于整个程序来说它都将被执行。
2、if-else结构
(1)语法形式
if(表达式)
语句1
else
语句2
其中,
①if和else是C语言的关键字,表达式及语句1、语句2解释同上;
②else不能独立存在,它必须与if语句配对、组合方可使用,否则会产生语法错误;
③else后面绝对不能跟条件表达式,它执行的条件是隐含的,即与之配对的if的反面。
(2)执行过程
首先计算表达式的值,然后根据其真假来决定程序的走向。若表达式为真(值为非零)则执行语句1,若为假(值为零)则执行语句2。退出分支结构后程序继续执行if-else结构后面的语句。
图4.2 if-else结构流程图
(3)举例
if(a>b)
b++;
else
a++;
若a的初值为20,b的初值为10,则表达式(a>b)为真,执行语句“b++;”,然后退出if-else结构,则a的结果为20,b的结果为11。
若a的初值为10,b的初值为20,则表达式(a>b)为假,执行语句“a++;”,然后退出if-else结构,则a的结果为11,b的结果为20。
前文曾提到过语句1和语句2都可以是复合语句,但如果不慎将语句1的花括号丢了,则编译时会出现语法错误,如下例:
main()
{int a=1,b=2;
if(a>b) a++; b--;
else a--; }
该程序执行时会出现错误提示信息:“Error:Misplaced else in function main”,因为此时else不能与if合法匹配,而else又不能独立存在,所以出现了上述错误。
二、嵌套的二分支选择结构
1、在if语句中嵌套分支结构
(1)语法形式
if(表达式1)
if(表达式2) 语句1
else 语句2
else 语句3
其中,
①表达式1、2均可以是任意的表达式;
②语句1、2、3均可以是一条简单语句或复合语句;
③内层if-else语句书写时注意格式缩进以培养良好的程序设计风格;
④内层if-else结构仍然可以继续嵌套,以此类推。
(2)执行过程
首先计算表达式1的值,若表达式1为真则执行内层if-else语句,若表达式1为假则执行语句3。若执行内层if-else语句,则计算表达式2的值,若表达式2为真则执行语句1,若表达式2为假则执行语句2。总之,程序必须在语句1、2、3中选择其一来执行。
(a)外层if-else流程图 (b)内层if-else流程图
图4.3 if嵌套的分支结构流程图