C++流程控制语句
语句是C++程序中的基本功能单元。任何一条C++语句都会为完成某项任务而进行相关的操作。C++语句通常以分号作为结束标志。
C++中的语句分为以下几种:
表达式语句:是最简单的语句形式,一般格式为:表达式;
空语句:只由一个分号构成的语句,一般格式为: ;
注意:空语句不执行任何操作,但具有语法作用。例如:for循环在有些情况下,循环体或者循环判别条件是空语句。
复合语句:由“{}”括起来的一组语句,一般格式为: { 若干语句序列 }
注意:复合语句描述一个块,在语法上起一个语句的作用。复合语句中的每个语句以“;”结束,而整个复合语句的结束符为“}”。
流程控制语句:用来控制或改变程序的执行方向的语句.
if语句
1、基本if语句
语法:
if(条件表达式)
语句或语句块
执行过程:首先计算条件表达式的值,如果此值不为 “真”,则执行语句或语句块;如果此值为 “假”,则忽略语句或语句块即不执行,而继续执行整个语句之后的语句。
例、输入一个整数,判断正负情况
#include <iostream>
using namespace std;
int main()
{
int n;
cout<<"请输入一个整数:"<<endl;
cin>>n;
if (n>0)
cout<<"正";
if (n==0)
cout<<"零";
if (n<0)
cout<<"负";
return 0;
}
2、if...else语句
语法:
if(条件表达式)
语句或语句块1
else
语句或语句块2
执行过程:首先计算条件表达式的值,如果此值不为 “真”,则执行语句或语句块1,然后忽略后面的语句或语句块2去执行整个语句之后的语句;如果此值为 “假”,则忽略语句或语句块1执行语句或语句块2,然后继续执行整个语句之后的语句。
例、输入一个年份,判断是否为闰年。
#include <iostream>
using namespace std;
int main( ){
int year;
cout<<"输入年份:"<<endl;
cin>>year;
if (year%4==0&&year%100!=0||year%400==0)
cout<<year<<"是闰年"<<endl;
else cout<< year<<"年不是闰年"<<endl;
return 0;
}
3、If语句的嵌套
嵌套if语句有2种形式:
嵌套在else分支中,格式如下:
if (表达式1)
语句或语句块1
else if (表达式2)
语句或语句块2
else if …
else语句或语句块k
嵌套在if分支中,格式如下:
if (表达式1){
if (表达式2)
语句或语句块1
else
语句或语句块2
}
else
语句或语句块3
配对原则
C++规定:在嵌套if语句中,if和else按照“就近配对”的原则配对,即相距最近且还没有配对的一对if和else首先配对。
if中嵌套的形式较容易产生逻辑错误,而else中嵌套的形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用在else分支中嵌套的形式,故对此进一步说明之:
if(条件表达式1)
语句或语句块1
else if(条件表达式2)
语句或语句块2
else if(条件表达式3)
语句或语句块3
......
else
语句或语句块k
执行过程:从上向下逐一对if之后的条件进行检测。如果某一条件为“真”,则执行相应的if子句的语句或语句块并越过剩余的部分,然后继续执行整个语句之后的语句;如果所有条件都为“假”,则执行最后一个else子句的语句或语句块,然后继续执行整个语句之后的语句。
例、求三个整数中的最大值。
#include <iostream>
using namespace std;
int main(){
int a, b, c, max;
cout<<"输入三个整数:";
cin>>a>>b>>c;
if(a>b&&a>c) max=a;
else if(b>a&&b>c) max=b;
else max=c;
cout<<"最大数为:max="<<max<<endl;
return 0;
}
switch语句
switch(表达式)
{
case 常量表达式1:
语句或语句块1
break;
case 常量表达式2:
语句或语句块2
break;
case 常量表达式3:
语句或语句块3
break;
… …
default:
语句或语句块K
[break;]
}
执行流程参见下图(特别提示,与许多资料上的流程图相比,这个图表示的意思是比较全面准确的):
或图示为:
说明:
switch语句中的表达式 必须是一个整型、字符型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。
case 的 常量表达式1,常量表达式2等 必须与 switch 中的表达式量具有相同的数据类型,且必须是一个常量或字面量。在一个 switch 中可以有任意数量的 case 语句(case子句)。每个 case 后跟一个要比较的值(常量表达式)和一个冒号,其后语句或语句块可没有,且语句块(多条语句)不必用{}括起来。
break是可选的不是每一个 case 都需要包含 break。遇到break就跳出整个switch语句,如果子句中不包含 break,若有后续的子句,将接着处理后续的子句,而不论是否匹配,直至switch语句尾部或遇到下一个break,因此一般包含break!详见下面的例子。
default语句(default子句)可没有,若有一般将将default语句放在所有case语句结束之后。default顾名思义是处理缺省情况,当常量表达式都不匹配的情况下执行之。
例、
#include <iostream>
using namespace std;
int main ()
{
char grade = 'D';
switch(grade)
{
case 'A' :
cout << "很棒!" << endl;
break;
case 'B' :
case 'C' :
cout << "做得好" << endl;
break;
case 'D' :
cout << "您通过了" << endl;
break;
case 'F' :
cout << "最好再试一下" << endl;
break;
default :
cout << "无效的成绩" << endl;
}
cout << "您的成绩是 " << grade << endl;
return 0;
}
运行之,参见下图:
请留意输出结果:
您通过了
您的成绩是 D
为了了解C++中switch语句中break语句有什么用,现在将上例中break语句注释掉:
#include <iostream>
using namespace std;
int main ()
{
char grade = 'D';
switch(grade)
{
case 'A' :
cout << "很棒!" << endl;
//break;
case 'B' :
case 'C' :
cout << "做得好" << endl;
//break;
case 'D' :
cout << "您通过了" << endl;
//break;
case 'F' :
cout << "最好再试一下" << endl;
//break;
default :
cout << "无效的成绩" << endl;
}
cout << "您的成绩是 " << grade << endl;
return 0;
}
运行之,参见下图:
请留意输出结果:
您通过了
最好再试一下
无效的成绩
您的成绩是 D
对比上面的例子,可以看到区别:没有break,除了执行匹配的语句或语句块,还会顺序执行其后语句或语句块,而不论是否匹配,直至switch语句尾部或遇到下一个break。
【问:switch某个符合条件的case后不加break,为什么会执行后面不符合case的语句?
答:switch起到的作用类似于跳转,满足switch的条件会跳转到对应的case下执行代码。如果不加break,代码会从那开始执行,不符合case的语句也会被执行,直到一直执行到最后或遇到下一个break才会跳出switch结构。】
循环语句
1、while语句
while(判断表达式)
循环体
当判断表达式(条件)为真时执行循环体;当条件为假时,程序流将循环语句后的语句。循环体是语句或语句块。
例、计算1+2+3+…+100的值。代码如下:
#include <iostream>
using namespace std;
const int n=100; //用常变量利于修改程序
int main(){
int i=1,sum=0; //循环初始条件
while(i<=n){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl;
return 0;
}
2、do...while语句
do
循环体
while(判断表达式);
条件表达式出现在循环的尾部,所以循环体会在条件被测试之前至少执行一次。
如果条件为真,就会执行循环体,这个过程会不断重复,直到给定条件变为假为止。
例、输出1,2,……,10。代码如下:
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 1;
// do 循环执行
do
{
cout << "a 的值:" << a << endl;
a = a + 1;
}while( a < 10 );
return 0;
}
3、for循环语句
for(表达式1;表达式2;表达式3)
循环体
执行流程参见下图:
执行过程说明:
1) 计算表达式1的值;
2) 计算表达式2的值,若表达式的值为真(或非0),则执行循环体;
3) 计算表达式3的值;
4) 再次计算表达式2的值,并重复以上过程;
5) 直到表达式2的值为假(或为0),则结束该循环。
循环初始条件可在表达式1中,循环条件的判断可包含在表达式2中,而循环条件变量的修改可包含在表达式3中,也可放在循环体中。
例、计算1+2+3+…+100的值。代码如下:
#include <iostream>
using namespace std;
int main(){
int sum=0;
for(int i=1 ; i<=100 ; i++)
sum +=i;
cout << "sum = " << sum << endl;
return 0;
}
运行之,参见下图:
for语句中的三个表达式可部分或全部省略,但两个分号不能省略。常见的是:将表达式1放在了for语句之前,或表达式3放在了循环体中,在for语句中就可相应地省略表达式1或表达式3。
4、循环的嵌套
当循环语句中的循环体又是一个循环语句时,就构成了“嵌套循环”。
for 语句、while语句和do-while语句均可以构成嵌套形式,这三种语句还可以互相嵌套。
例、打印如下图形。
* * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * *
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int i,j;
for(i=1;i<=5;i++){
for(j=1;j<=5-i;j++) cout<<" " ; //输出若干空格
for(j=1;j<=11;j++) cout<<"* "; //输出若干*
cout<<endl; //准备输出下一行
}
return 0;
}
例、写一个九九乘法表
#include<iostream>
using namespace std;
int main()
{
int i,j,t;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
t=j*i;
cout<<j<<"*"<<i<<"="<<t<<" ";
}
cout<<endl;
}
return 0;
}
运行之,参见下图:
break语句
只能用在switch语句和循环语句中。作用:跳出switch语句或提前终止循环。
使用break语句的例:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
for (int i=1; i<20; i++){
if (i % 3==0) break; //能被3整除时,便由break退出循环
cout<<i<<'\t';
}
return 0;
}
运行之,参见下图:
continue语句
位置:只能用在循环语句中。作用:终止本次循环,即跳过其后尚未执行的循环体语句,并开始下一次循环。
使用continue语句的例:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
for (int i=1; i<20; i++){
if (i % 3==0) continue; //能被3整除时结束本次循环
cout<<i<<'\t';
}
return 0;
}
运行之,参见下图:
continue语句与break语句的区别是:continue语句结束本次循环,而break语句是结束整个循环。
goto语句
一般使用形式:
goto 标识;
...
标识://注意有一冒号,而且其后可有语句
说明:goto语句和标识一起使用,控制程序从goto语句所在的地方转移到标识处。所谓“标识”,是用标识符标识的语句。应用:在某些特定场合下,比如在多层循环嵌套中,要从深层循环跳出,若用break语句,不仅要使用多次,而且可读性较差,这时goto语句可以发挥作用。
使用goto语句的例:
#include <iostream>
using namespace std;
int main ()
{
int a = 1;
LOOP:
do{
if( a == 5)
{
a = a + 1;
goto LOOP;
}
cout << "a 的值:" << a << endl;
a = a + 1;
}while( a < 10 );
return 0;
}
运行之,参见下图: