5 C++的语句及程序流程控制
语句是C++中最小可执行单元,用于规定程序执行的控制流程。在C++中,一条语句的结束用分号(;)进行标识。
语句分为:
简单语句——包括空语句、说明语句和表达式语句。
空语句不包括任何数据或运算符,仅由一个分号构成,不执行任何操作。常用在空循环中,用作时间延迟。
在一个常量、变量或函数说明之后加一个分号就构成一个说明语句,它是C++中唯一可以在函数体外书写的语句。
在表达式后加一个分号便构成了表达式语句,它是C++程序完成其功能的最重要的组成部分。
复合语句在许多C++语法结构中,只允许出现一条语句(如条件、循环语句),而从程序的流程及逻辑结构上看,又需要执行多条语句,为此,需要使用复合语句。
一个复合语句是由用一对大括号“{}”限制起来的多个简单语句或复合语句。
注意:(1)、复合语句可以作为一个单一的可执行单元出现在所有单一简单语句可以出现的地方。
(2)、复合语句内的各个简单语句必须以分号标识各个语句的结束,而复合语句的结束不需要再以分号标识其结束。
每一个C++程序都是从main()函数或winmain()函数的第一条语句开始顺序执行,直到该函数的最后一条语句执行完毕。为了适应程序流程的不同控制,C++提供了条件分支控制、开关分支控制、循环控制、跳转控制等多种流程控制语句,以下分别进行讨论。
2.5.1 if条件分支语句语法结构如下:
if (expression) 例如:if(str= =”student”)
statement;//简单或复合语句 cout<<”this string is a record of a student”;
或
if (expression) statement;
else statement;
其中expression为一个条件表达式。由条件运算符组成的条件判断式,必须放在if标识符后的括号中。
如果出现两个以上的if_else语句嵌套形式,在C++中规定:else语句与同一层中与之最接近而且没有其它else语句与之相配的if语句相配对。
例如:
if (var>1)
if(var<10)
cout<<”var=”<<var<<”\n”;
else
cout<<”The value of the varible is not permited!\n”;
注意:1、可以使用大括号表示的复合语句,改变if语句和else语句之间的搭配关系。
2、使用阶梯式if_else_if语句。其一般语法结构如下:
if (exoression1) statement1;
else if (expression2) statement2;
else if (expression3) statement3;
,,,
else statementn;
被执行的语句只能是语句statement1~statementn中的一条语句,而不可能出现有两条或两条以上语句被执行的情况。
2.5.2 switch开关分支语句虽然使用阶梯式if_else_if语句可以实现多路检验,但是它缺乏灵活性,程序书写麻烦,且程序易读性不好。为此在C++中提供了专门的语句——switch 开关分支语句。
Switch语句中设定一个供进行判断的开关变量,该开关变量逐个与一系列整型常量进行比较。当发现该开关变量与某一整型常量或字符型常量相匹配时,该整型常量或字符常量处便成了程序执行的入口,其后的语句将依次被执行。
注意:若无跳出语句break,则开关分支语句中入口之后的各条语句均被执行,然后执行switch开关分支语句后的第一条语句。故需要在适当地地方插入break语句。
Switch的格式如下:
switch(varible)
{
case const1:
statement1-1;
,,,
statement1-n;
case const2:
statement2-1;
,,,
statement2-n;
break; //利用break语句跳出switch语句,
case const3,//从而不执行与其它常量相对应的语句体。
statement3-1;
,,,
statement3-n;
,,,
default:
statement3-1;
,,,
statement3-n;
}
switch开关分支语句与阶梯式if_else_if语句的区别:
①、switch语句仅能检测开关变量的值是否与一组常量中的某一个相等;而if语句则可以计算多个条件表达式;
②、在同一个switch语句的同一层次上,不允许两个case常量具有相同的值,而if语句对其中的条件表达式则无此规定;
③、在switch语句中,每个case常量可以与若干个语句相对应,而在if语句中,每一个if、else if或else只能对应一条简单或者复杂语句。
2.5.3 循环控制语句
C++提供了三种循环控制语句,这三种循环控制语句都有一个条件判断表达式,执行时根据条件判断的结果决定是否执行某一组语句。下面分别进行讨论。
2.5.2.1 while循环控制语句
while循环语句的语法结构如下所示:
while(expression) statement; //简单语句或复合语句该语句执行时,首先判断条件表达式expression的值,若其值为真(任意非0值),则执行语句statement;然后再继续判断条件表达式的值,……这样周而复始地进行条件判断和语句的执行,直到条件表达式计算的结果为假(其值为0),则终止循环,跳出循环流程,继续执行循环控制语句的下一条语句。
注意:(1)、在statement中一般必须对条件表达式中的某些元素作相应的变动,否则将会导致死循环。
(2)、该语句在循环的头部进行条件判断。因此若第一次判断为假时该循环不执行任何其他语句,直接跳出循环,执行下一条语句。
2.5.2.2 do_while循环控制语句有时需要确保循环体被执行,至少被执行一次,使用while语句就不太合适。在这种情况下,可以使用do_while循环控制语句。其语法结构如下:
do
statement;
while(expression);
注意:do_while循环控制语句是在循环体的结尾处进行条件测试。
2.5.2.3 for循环控制语句
for循环主要用于扫描具有固定长度的数据结构(即进行固定次数的循环),其语法结构如下:
for(initial_statement;expression1;expression2)
statement; //简单语句或复合语句其中initial_statement可以是一个说明语句或表达式,它在第一次循环的开头被执行,且只被执行一次,常用于说明说明循环所使用的循环变量,对一组变量进行初始化或赋值。
当然initial_statemwent也可以是一个空语句。expression1用于循环控制的条件测试。该语句在每次循环的开头被执行,若在第一次循环时该语句的值为假,则循环体将一次也不被执行。expression2在每次循环体执行后被执行,它主要用于修改循环变量。
2.5.4 跳转控制语句跳转控制语句可以改变正常的程序运行流程,在程序间实现控制转移。常用的跳转控制语句有break、continue和goto语句。下面将分别介绍。
2.5.4.1 break跳转控制语句
break跳转控制语句常用于循环控制和开关分支控制内,用于终止最内层的while、do、for 循环或switch流程的执行,并转向本循环体外的下一条语句。
[例2.10] break跳转控制语句用法。//EX2_10.cpp
2.5.4.2 continue语句
continue语句仅使最内层的循环体终止当前进行的这次循环,而break语句则终止整个循环的执行。在while循环和do循环中,continue语句的出现将导致将控制权转至对循环条件的判断;而for循环中,遇到continue时,程序转去执行语句expression2。
2.5.4.3 goto语句
goto语句可以使程序流程跳转到任意一条具有特定标号的语句处。goto语句格式如下:
goto label;
其中label是一个用户定义的标识符,该标识符只可作为goto跳转的目的语句标号。该含语句标号的目的语句的语法结构如下:
label:statement;
注意:(1)、goto语句不能跳过一个变量的显示或隐式初始化,除法这一定义出现在一个块结构中,并且整个被跳过。
(2)、一般来说,不鼓励使用goto语句。
语句是C++中最小可执行单元,用于规定程序执行的控制流程。在C++中,一条语句的结束用分号(;)进行标识。
语句分为:
简单语句——包括空语句、说明语句和表达式语句。
空语句不包括任何数据或运算符,仅由一个分号构成,不执行任何操作。常用在空循环中,用作时间延迟。
在一个常量、变量或函数说明之后加一个分号就构成一个说明语句,它是C++中唯一可以在函数体外书写的语句。
在表达式后加一个分号便构成了表达式语句,它是C++程序完成其功能的最重要的组成部分。
复合语句在许多C++语法结构中,只允许出现一条语句(如条件、循环语句),而从程序的流程及逻辑结构上看,又需要执行多条语句,为此,需要使用复合语句。
一个复合语句是由用一对大括号“{}”限制起来的多个简单语句或复合语句。
注意:(1)、复合语句可以作为一个单一的可执行单元出现在所有单一简单语句可以出现的地方。
(2)、复合语句内的各个简单语句必须以分号标识各个语句的结束,而复合语句的结束不需要再以分号标识其结束。
每一个C++程序都是从main()函数或winmain()函数的第一条语句开始顺序执行,直到该函数的最后一条语句执行完毕。为了适应程序流程的不同控制,C++提供了条件分支控制、开关分支控制、循环控制、跳转控制等多种流程控制语句,以下分别进行讨论。
2.5.1 if条件分支语句语法结构如下:
if (expression) 例如:if(str= =”student”)
statement;//简单或复合语句 cout<<”this string is a record of a student”;
或
if (expression) statement;
else statement;
其中expression为一个条件表达式。由条件运算符组成的条件判断式,必须放在if标识符后的括号中。
如果出现两个以上的if_else语句嵌套形式,在C++中规定:else语句与同一层中与之最接近而且没有其它else语句与之相配的if语句相配对。
例如:
if (var>1)
if(var<10)
cout<<”var=”<<var<<”\n”;
else
cout<<”The value of the varible is not permited!\n”;
注意:1、可以使用大括号表示的复合语句,改变if语句和else语句之间的搭配关系。
2、使用阶梯式if_else_if语句。其一般语法结构如下:
if (exoression1) statement1;
else if (expression2) statement2;
else if (expression3) statement3;
,,,
else statementn;
被执行的语句只能是语句statement1~statementn中的一条语句,而不可能出现有两条或两条以上语句被执行的情况。
2.5.2 switch开关分支语句虽然使用阶梯式if_else_if语句可以实现多路检验,但是它缺乏灵活性,程序书写麻烦,且程序易读性不好。为此在C++中提供了专门的语句——switch 开关分支语句。
Switch语句中设定一个供进行判断的开关变量,该开关变量逐个与一系列整型常量进行比较。当发现该开关变量与某一整型常量或字符型常量相匹配时,该整型常量或字符常量处便成了程序执行的入口,其后的语句将依次被执行。
注意:若无跳出语句break,则开关分支语句中入口之后的各条语句均被执行,然后执行switch开关分支语句后的第一条语句。故需要在适当地地方插入break语句。
Switch的格式如下:
switch(varible)
{
case const1:
statement1-1;
,,,
statement1-n;
case const2:
statement2-1;
,,,
statement2-n;
break; //利用break语句跳出switch语句,
case const3,//从而不执行与其它常量相对应的语句体。
statement3-1;
,,,
statement3-n;
,,,
default:
statement3-1;
,,,
statement3-n;
}
switch开关分支语句与阶梯式if_else_if语句的区别:
①、switch语句仅能检测开关变量的值是否与一组常量中的某一个相等;而if语句则可以计算多个条件表达式;
②、在同一个switch语句的同一层次上,不允许两个case常量具有相同的值,而if语句对其中的条件表达式则无此规定;
③、在switch语句中,每个case常量可以与若干个语句相对应,而在if语句中,每一个if、else if或else只能对应一条简单或者复杂语句。
2.5.3 循环控制语句
C++提供了三种循环控制语句,这三种循环控制语句都有一个条件判断表达式,执行时根据条件判断的结果决定是否执行某一组语句。下面分别进行讨论。
2.5.2.1 while循环控制语句
while循环语句的语法结构如下所示:
while(expression) statement; //简单语句或复合语句该语句执行时,首先判断条件表达式expression的值,若其值为真(任意非0值),则执行语句statement;然后再继续判断条件表达式的值,……这样周而复始地进行条件判断和语句的执行,直到条件表达式计算的结果为假(其值为0),则终止循环,跳出循环流程,继续执行循环控制语句的下一条语句。
注意:(1)、在statement中一般必须对条件表达式中的某些元素作相应的变动,否则将会导致死循环。
(2)、该语句在循环的头部进行条件判断。因此若第一次判断为假时该循环不执行任何其他语句,直接跳出循环,执行下一条语句。
2.5.2.2 do_while循环控制语句有时需要确保循环体被执行,至少被执行一次,使用while语句就不太合适。在这种情况下,可以使用do_while循环控制语句。其语法结构如下:
do
statement;
while(expression);
注意:do_while循环控制语句是在循环体的结尾处进行条件测试。
2.5.2.3 for循环控制语句
for循环主要用于扫描具有固定长度的数据结构(即进行固定次数的循环),其语法结构如下:
for(initial_statement;expression1;expression2)
statement; //简单语句或复合语句其中initial_statement可以是一个说明语句或表达式,它在第一次循环的开头被执行,且只被执行一次,常用于说明说明循环所使用的循环变量,对一组变量进行初始化或赋值。
当然initial_statemwent也可以是一个空语句。expression1用于循环控制的条件测试。该语句在每次循环的开头被执行,若在第一次循环时该语句的值为假,则循环体将一次也不被执行。expression2在每次循环体执行后被执行,它主要用于修改循环变量。
2.5.4 跳转控制语句跳转控制语句可以改变正常的程序运行流程,在程序间实现控制转移。常用的跳转控制语句有break、continue和goto语句。下面将分别介绍。
2.5.4.1 break跳转控制语句
break跳转控制语句常用于循环控制和开关分支控制内,用于终止最内层的while、do、for 循环或switch流程的执行,并转向本循环体外的下一条语句。
[例2.10] break跳转控制语句用法。//EX2_10.cpp
2.5.4.2 continue语句
continue语句仅使最内层的循环体终止当前进行的这次循环,而break语句则终止整个循环的执行。在while循环和do循环中,continue语句的出现将导致将控制权转至对循环条件的判断;而for循环中,遇到continue时,程序转去执行语句expression2。
2.5.4.3 goto语句
goto语句可以使程序流程跳转到任意一条具有特定标号的语句处。goto语句格式如下:
goto label;
其中label是一个用户定义的标识符,该标识符只可作为goto跳转的目的语句标号。该含语句标号的目的语句的语法结构如下:
label:statement;
注意:(1)、goto语句不能跳过一个变量的显示或隐式初始化,除法这一定义出现在一个块结构中,并且整个被跳过。
(2)、一般来说,不鼓励使用goto语句。