C++程序设计 湖南大学 杜四春、银红霞
第 3章 控制语句
3.1 顺序控制语句
3.2 选择控制语句
3.3 循环控制语句
3.4 跳转语句
C++程序设计 湖南大学 杜四春、银红霞
高级语言源程序的基本组成单位是语句。
在 C++程序中,语句是最小的可执行单元,一
条语句由一个分号结束。
? C++程序的语句按其功能可以划分为两类:
操作运算语句
流程控制语句
? 基本的控制结构有三种:
顺序结构,选择结构,循环结构
C++程序设计 湖南大学 杜四春、银红霞
3.1 顺序控制语句
顾名思义,所谓顺序结构,就是指按照语
句在程序中的先后次序一条一条的顺次执行。
顺序控制语句是一类简单的语句,上述的操作
运算语句即是顺序控制语句,包括表达式语句,
输入 /输出等。
C++程序设计 湖南大学 杜四春、银红霞
3.1.1 表达式语句
任何一个表达式后面加上一个分号就构成了表达
式语句 ( 没有分号的不是语句 ) 。 表达式是指用运算
符连接各个运算对象, 合乎语法规则的式子 。
例如, 以下都是表达式语句:
a=3+5;
a>b?a:b;
a=1,b=2,c=3;
printf(“hello\n”);
常见的表达式语句有以下几种:空语句、赋值语
句、函数调用语句。
C++程序设计 湖南大学 杜四春、银红霞
1,空语句
空语句是指只有一个分号而没有表达式的语句 。
语法格式为:;
空语句不做任何操作运算, 而只是作为一种形式
上的语句, 填充在控制结构之中 。 这些填充处需要一
条语句, 但又不做任何操作 。
空语句是最简单的表达式语句。
C++程序设计 湖南大学 杜四春、银红霞
2,赋值语句
赋值语句是由赋值表达式加一个语句结束标志
( 分号, ;, ) 构成的语句 。 语法格式为:
变量 赋值运算符 表达式;
例如,a=1;
b+=2;
c=sin(d);
可以多重赋值, 将一个表达式的值同时赋给多个
变量 。 如,变量 1=变量 2= … =变量 n=表达式;
等价于:
变量 1=表达式;变量 2=表达式; … ;变量 n=表达式 ;
C++程序设计 湖南大学 杜四春、银红霞
3,函数调用语句
函数调用语句是由函数调用表达式加一个语句结
束标志 ( 分号, ;, ) 构成的语句 。
例如:
scanf(“%d”,&e);
max(a,b);
C++程序设计 湖南大学 杜四春、银红霞
3.1.2 输入 /输出( I/O)
C++程序没有输入 /输出语句,它的输入 /输出功能
由函数( scanf,printf)或流控制来实现。输入 /输出
流( I/0流)是输入或输出的一系列字节。 C++定义了
运算符,<<”和,>>”的 iostream类。在这里只介绍如
何利用 C++的标准输入 /输出流实现数据的输入 /输出
功能。
C++程序设计 湖南大学 杜四春、银红霞
1,输入
当程序需要执行键盘输入时, 可以使用抽取操作
符, >>”从输入流 cin中抽取键盘输入的字符和数字,
并把它赋给指定的变量 。 例如:
#include<iostream.h>
void main()
{
int a;
cin>>a;
}
注意:这里的抽取操作符,>>”与位移运算符
,>>”是同样的符号,但这种符号在不同的地方其含
义是不一样的。
C++程序设计 湖南大学 杜四春、银红霞
2,输出
当程序需要在屏幕上显示输出时, 可以使用插入
操作符, <<”向输出流 cout中插入字符和数字, 并把
它在屏幕上显示输出 。 例如:
#include<iostream.h>
void main()
{
cout<<”Hello.\n”;
}
与输入一样,这里的插入操作符,<<”与位移运
算符,<<”是同样的符号,但这种符号在不同的地方
其含义是不一样的。
C++程序设计 湖南大学 杜四春、银红霞
在 C++程序中, cin与 cout允许将任何基本数据类
型的名字或值传给流 。 而且书写格式较灵活, 可以在
同一行中串连书写, 也可以分写在几行, 提高可读性 。
例如,cout<<”hello”;
cout<<3;
cout<<endl;
等价于:
cout<<”hello”<<3<<endl;
也等价于:
cout<<”hello” //注意:行末无分号
<<3 //行末无分号
<<endl;
C++程序设计 湖南大学 杜四春、银红霞
又例如:
int a; double b;
cin>>a>>b; //cin可分辨不同的抽取
//变量类型
C++程序设计 湖南大学 杜四春、银红霞
3,常用的控制符
用控制符( manipulators)可以对 I/O流的格式进
行控制。 C++在头文件 iomanip.h中定义了控制符对象,
可以直接将这些控制符嵌入到 I/O语句中进行格式控制。
在使用这些控制符时,要在程序的开头包含头文件
iomanip.h。
表 3-1列出了常用的 I/O流控制符。
C++程序设计 湖南大学 杜四春、银红霞
控制符 含义
dec 数值数据采用十进制表示
hex 数值数据采用十六进制表示
oct 数值数据采用八进制表示
setw( n) 设置域宽为 n个字符
setprecision( n) 设置浮点数的小数位数(包括小数点)
setioflags( ios::uppercase) 十六进制数大写输出
setioflags( ios::lowercase) 十六进制数小写输出
setiosflags( ios::left) 左对齐
setiosflags( ios::right) 右对齐
setiosflags( ios::showpos) 设置正、负符号的显示
setfill( c) 设置填充字符为 c
endl 插入换行符,并刷新流
表 3-1 常用的 I/O流控制符
C++程序设计 湖南大学 杜四春、银红霞
( 1)控制不同进制的输出(十进制、八进制、十六进制)
#include<iostream.h>
void main()
{ int a=1001;
cout<<”默认下:, <<a<<endl;
cout<<”十进制:, <<dec<<a<<endl;
cout<<”八进制:, <<oct<<a<<endl;
cout<<”十六进制:, <<hex<<a<<endl; }
此程序的运行结果为:
默认下,1001
十进制,1001
八进制,1751
十六进制,3e9
C++程序设计 湖南大学 杜四春、银红霞
( 2)控制输出宽度
#include<iostream.h>
#include<iomanip.h>
void main()
{ int a=1234567890;
double b=123.45;
cout<<setw(10)<<a<<endl;
cout<<setw(10)<<b<<endl;
cout<<setw(8)<<b<<endl;
cout<<setw(6)<<b<<endl;
cout<<setw(4)<<b<<endl; }
此程序的运行结果为:
1234567890
123.45
123.45
123.45
123.45
C++程序设计 湖南大学 杜四春、银红霞
( 3)控制输出精度
#include<iostream.h>
#include<iomanip.h>
void main()
{ double a=1.234567;
cout<<setprecision(3)<<a<<endl;
}
如果希望显示的数字是 1.23,即保留两位小数, 此
时可用 setprecision( n) 控制符加以控制, 此时显示 3位
有效位 。 当小数位数截短显示时, 进行四舍五入处理 。
C++默认的输出流数值的有效位是 6。
C++程序设计 湖南大学 杜四春、银红霞
( 4) 控制左右对齐
默认情况下,C++程序的 I/O流以左对齐方式显示
输出的内容。使用控制符 setiosflags( ios::left)和
setiosflags( ios::right),可以控制输出内容的左、右
对齐方式。 setiosflags( ios::left)和 setiosflags
( ios::right)控制符在头文件 iomanip.h中定义。
C++程序设计 湖南大学 杜四春、银红霞
( 5)控制正、负符号的显示
#include<iostream.h>
#include<iomanip.h>
void main()
{
cout<<10<<”,<<-20<<endl;
cout<<setiosflags(ios::showpos)<<30<<”,
<<-40<<endl;
}
此程序的运行结果为:
10 -20
+30 -40
C++程序设计 湖南大学 杜四春、银红霞
( 6)控制空位填充
#include<iostream.h>
#include<iomanip.h>
void main()
{
cout<<setfill(?*?)<<setw(4)<<12<<endl;
}
此程序的运行结果为,
**12
C++程序设计 湖南大学 杜四春、银红霞
3.1.3 复合语句
C++语言允许把一组语句用一对花括号括起来,
构成一个复合语句 。 例如:
{
int a;
a=1+2;
}
请注意:一个复合语句的右花括号, }”之后不能
再写分号 。
复合语句也称为分程序,是若干条语句的一个集
合,它在语法上是一个整体,相当于一个语句。在分
程序中定义的变量只在此分程序中有效。
C++程序设计 湖南大学 杜四春、银红霞
3.2 选择控制语句
选择语句又称为分支语句,它通过对给定
的条件进行判断,从而决定执行两个或多个分
支中的哪一支。因此,在编写选择语句之前,
应该首先明确判断条件是什么,并确定当判断
结果为“真”或“假”时应分别执行什么样的
操作(算法)。
C++程序中提供的选择语句有两种:
if… else语句和 switch语句。
C++程序设计 湖南大学 杜四春、银红霞
3.2.1 if… else语句
1,if语句
if语句的语法格式为:
if ( 条件表达式 ) 或,if ( 条件表达式 )
语句; {
语句序列;
}
它的意义为:如果条件表达式进行一次测试, 且
测试为真, 则执行后面的语句 。
当语句序列只包含一条语句时, 包围该语句序列
的花括号可以省略 。
C++程序设计 湖南大学 杜四春、银红霞
例如:判断用户的输入, 如果输入的数值大于 0,
则在屏幕上显示, 正数, 。
#include<iostream.h>
void main()
{
int a;
cin>>a;
if(a>0)
cout<<”正数, <<endl;
}
C++程序设计 湖南大学 杜四春、银红霞
2,空语句
编译器必须在 if条件表达式的后面找到一个作为语
句结束符的分号, ;,, 以标志 if语句的结束 。 这样,
如果是下面的代码:
if ( 条件表达式 ) ; //空语句做 if中的语句
语句;
则不管条件表达式为真为假, 总是接着执行分号后的
语句 。 即相当于 if语句不做任何事 。
C++程序设计 湖南大学 杜四春、银红霞
3,if… else语句
if… else语句的语法格式为:
if ( 条件表达式 )
{
语句序列 1;
}
else
{
语句序列 2;
}
它的意义为:如果, 条件表达式, 的判断结果为
真, 则执行语句序列 1;如果, 条件表达式, 的判断结
果为假, 则执行语句序列 2。
C++程序设计 湖南大学 杜四春、银红霞
判断用户的输入, 如果输入的数值大于 0,则在屏
幕上显示, 正数, ;否则在屏幕上显示, 不是正数, 。
#include<iostream.h>
void main()
{
int a;
cin>>a;
if(a>0)
cout<<”正数, <<endl;
else
cout<<”不是正数, <<endl;
}
C++程序设计 湖南大学 杜四春、银红霞
当多个 if… else语句嵌套时,为了防止出现二义性,
C++语言规定,由后向前使每一个 else都与其前面的
最靠近它的 if配对。如果一个 else的上面又有一个未经
配对的 else,则先处理上面的(内层的) else的配对。
例如:判断 a,b,c三个数中的最大值 。
if (a>b)
if(a>c)
max=a;
else
max=c;
else
if(b>c)
max=b;
else
max=c;
C++程序设计 湖南大学 杜四春、银红霞
当多个 if… else语句嵌套时,在容易误解的地方可
以按照语法关系加上花括号来标识逻辑关系的正确性。
如上例可以改写为:
if (a>b)
{ if(a>c)
max=a;
else
max=c;
}
else
{ if(b>c)
max=b;
else
max=c;
}
C++程序设计 湖南大学 杜四春、银红霞
3.2.2 switch语句
switch语句是多分支的选择语句 。 嵌套的 if语句可
以处理多分支选择 。 但是, 用 switch语句更加直观 。
switch语句的语法格式为:
switch ( 整数表达式 )
{
case 常量表达式 1,<语句序列 1>;
case 常量表达式 2,<语句序列 2>;
……
case 常量表达式 n,<语句序列 n>;
default,<语句序列 n+1>;
}
C++程序设计 湖南大学 杜四春、银红霞
switch语句的执行顺序是:首先对“整数表达式”
进行计算,得到一个整型常量结果,然后从上到下寻
找与此结果相匹配的常量表达式所在的 case语句,以
此作为入口,开始顺序执行入口处后面的各语句,直
到遇到 break语句,才结束 switch语句,转而执行
switch结构后的其他语句。如果没有找到与此结果相
匹配的常量表达式,则从 default:处开始执行语句序
列 n+1。
C++程序设计 湖南大学 杜四春、银红霞
例如, 根据考试成绩的等级输出百分制分数段,
char grade;
//...
switch (grade)
{
case?A?,cout <<,85~100\n”;break;
case?B?,cout <<,70~84\n”;break;
case?C?,cout <<,60~69\n”;break;
case?D?,cout <<,<60\n”;break;
default,cout <<,error\n”;break;
}
若 grade的值为 ‘ A?,则程序的输出结果为:
85~100
C++程序设计 湖南大学 杜四春、银红霞
几点说明:
( 1) default语句是可缺省的 。
( 2) switch后面括号中的表达式只能是整型, 字符型或
枚举型表达式 。
( 3) 在各个分支中的 break语句起着退出 switch语句的作
用 。
( 4) case语句起标号的作用 。 标号不能重名 。
( 5) 可以使多个 case语句共用一组语句序列 。
( 6) 各个 case( 包括 default) 语句的出现次序可以任意 。
( 7) 每个 case语句中不必用 { },而整体的 switch结构一
定要写一对花括号 { }。
( 8) switch结构也可以嵌套 。
C++程序设计 湖南大学 杜四春、银红霞
3.3 循环控制语句
C++提供了三种循环控制语句,while语句,
do… while语句, for语句 。 三种语句都由相似的三部分
组成:进入循环的条件, 循环体, 退出循环的条件;
完成的功能也类似 。 所不同的只是三者进入与退出循
环的方式不同 。
? while语句,当条件满足时进入, 重复执行循环
体, 直到条件不满足时退出 。
? do… while语句,无条件进入, 执行一次循环体
后判断是否满足条件, 当条件满足时重复执行循环体,
直到条件不满足时退出 。
? for语句,当循环变量在指定范围内变化时, 重复
执行循环体, 直到循环变量超出了指定的范围时退出 。
C++程序设计 湖南大学 杜四春、银红霞
3.3.1 while语句
while语句的语法格式为:
while ( 条件表达式 )
循环体;
它的含义为:首先对条件表达式进行判断, 若判
断结果为假 ( false,0), 则跳过循环体, 执行 while
结构后面的语句 。 若判断结果为真 ( true,非 0), 则
进入循环体, 执行其中的语句序列 。 执行完一次循环
体语句后, 修改循环变量, 再对条件表达式进行判断,
若判断结果为真, 则再执行一次循环体语句, …… 依
次类推, 直到判断结果为假时, 退出 while循环语句,
转而执行后面的语句 。 即, 先判断后执行, 。
C++程序设计 湖南大学 杜四春、银红霞
while循环由 4个部分组成:循环变量初始化, 判断
条件, 循环体, 改变循环变量的值 。
例如, 计算 sum=1+2+3+… +10的 while循环结构
如下:
sum=0;
i=1; //循环变量初始化
while (i<=10) //判断条件
{ //循环体
sum=sum+i;
i++; //改变循环变量的值
}
C++程序设计 湖南大学 杜四春、银红霞
注意:
( 1) 如果循环体包含一个以上的语句, 则应该用花括号
括起来, 以块语句形式出现 。
( 2) 仔细定义循环变量的初始值和判断条件的边界值 。
( 3) 对条件表达式的计算总是比循环体的执行多一次 。
这是因为最后一次判断条件为假时不执行循环体 。
( 4) 当循环体不实现任何功能时, 要使用空语句作为循
环体, 表示为:
while ( 条件表达式 ) ;
( 5)循环体中,改变循环变量的值很重要。如果循环
变量的值恒定不变,或者当条件表达式为一常数时,
将会导致无限循环(也即死循环)。若要退出一个无
限循环,必须在循环体内用 break等语句退出。
C++程序设计 湖南大学 杜四春、银红霞
3.3.2 do… while语句
do… while语句的语法格式为:
do
循环体;
while ( 条件表达式 ) ;
它的含义为:当流程到达 do后,立即执行循环体
语句,然后再对条件表达式进行判断。若条件表达式
的值为真(非 0),则重复执行循环体语句,否则退出。
即, 先执行后判断, 方式。
do… while语句与 while语句功能相似。
C++程序设计 湖南大学 杜四春、银红霞
例如:计算 sum=1+2+3+… +10的 do… while循环
结构如下:
sum=0;
i=1; //循环变量初始化
do
{ //循环体
sum=sum+i;
i++; //改变循环变量的值
} while (i<=10) //判断条件
与 while语句不同的是,while语句有可能一次都不
执行循环体,而 do… while循环至少执行一次,因为直
到程序到达循环体的尾部遇到 while时,才知道继续条
件是什么。
C++程序设计 湖南大学 杜四春、银红霞
do… while结构与 while结构中都具有一个 while语
句, 很容易混淆 。 为明显区分它们, do… while循环体
即使是一个单语句, 习惯上也使用花括号包围起来,
并且 while( 表达式 ) 直接写在花括号, }”的后面 。 这
样的书写格式可以与 while结构清楚地区分开来 。
例如:
do
{
sum+=i++;
} while (i<=100);
C++程序设计 湖南大学 杜四春、银红霞
3.3.3 for语句
for语句的语法格式为:
for( 表达式 1;表达式 2;表达式 3)
循环体;
其中,表达式 1可以称为初始化表达式,一般用于
对循环变量进行初始化或赋初值;表达式 2可以称为条
件表达式,当它的判断条件为真时,就执行循环体语
句,否则终止循环,退出 for结构;表达式 3可以称为修
正表达式,一般用于在每次循环体执行之后,对循环
变量进行修改操作;循环体是当表达式 2为真时执行的
一组语句序列。
C++程序设计 湖南大学 杜四春、银红霞
具体来说, for语句的执行过程如下:
( 1) 先求解表达式 1;
( 2) 求解表达式 2,若为 0( 假 ), 则结束循环,
并转到 ( 5) ;
( 3) 若表达式 2为非 0( 真 ), 则执行循环体, 然
后求解表达式 3;
( 4) 转回 ( 2) ;
( 5)执行 for语句下面的一个语句。
C++程序设计 湖南大学 杜四春、银红霞
例如, 计算 sum=1+2+3+… +10的 for循环结构如
下:
sum=0;
for (i=1;i<=10;i++) //初始化, 判断条
//件, 修改方式, 步长都在顶部描述
{
sum+=i; //循环体相对简洁
}
由此例可见, for语句将循环体所用的控制都放在
循环顶部统一表示, 显得更直观 。
C++程序设计 湖南大学 杜四春、银红霞
除此之外, for语句还充分表现了其灵活性 。 比
如, 表达式 3并不仅限于修正循环变量的值, 还可以是
任何操作 。 例如,for (sum=0,i=1;i<=10;
sum+=i,i++); 注意, 此时 for语句没有循环体, 也即
循环体是一个空语句 。
有时, 表达式 2被省略 。 即不判断循环条件, 循环
无终止进行下去 。 这时候, 需要在循环体中有跳出循
环的控制语句 。
最简单的表示无限循环的方式如下:
for( ; ; ) //分号不能省略
三个表达式都可省略。即不设初值,不判断条件
(认为表达式 2为真),循环变量不变化,无终止执行
循环体的语句。
C++程序设计 湖南大学 杜四春、银红霞
3.4 跳转语句
在 C++中, 除了提供顺序执行和选择控制,
循环控制语句外, 还提供了一类跳转语句 。 这
类语句的总体功能是中断当前某段程序的执行,
并跳转到程序的其他位置继续执行 。 常见的跳
转语句有三种,break语句, continue语句与
goto语句 。 其中, 前两种语句不允许用户自己
指定跳转到哪里, 而是必须按照相应的原则跳
转, 而后一种语句可以由用户事先指定欲跳转
到的位置, 按照用户的需要进行跳转 。
C++程序设计 湖南大学 杜四春、银红霞
3.4.1 break语句
break语句的作用是:结束当前正在执行的循环
( for,while,do… while) 或多路分支 ( switch) 程序
结构, 转而执行这些结构后面的语句 。
在 switch语句中, break用来使流程跳出 switch语
句, 继续执行 switch后的语句 。
在循环语句中,break用来从最近的封闭循环体内
跳出。
例如,下面的代码在执行了 break之后,继续执行
,a+=1;”处的语句,而不是跳出所有的循环:
C++程序设计 湖南大学 杜四春、银红霞
for ( ; ; )
{ …
for ( ; ; )
{

if (i==1)
break;

}
a+=1; //break跳至此处
//…
}
C++程序设计 湖南大学 杜四春、银红霞
3.4.2 continue语句
continue语句的作用是:结束当前正在执行的这一
次循环 ( for,while,do… while), 接着执行下一次
循环 。 即跳过循环体中尚未执行的语句, 接着进行下
一次是否执行循环的判定 。
在 for循环中, continue用来转去执行表达式 2。
在 while循环和 do… while循环中,continue用来转
去执行对条件表达式的判断。
continue语句和 break语句的区别是,continue语
句只结束本次循环,而不是终止整个循环的执行。而
break语句则是结束本次循环,不再进行条件判断。
C++程序设计 湖南大学 杜四春、银红霞
例如,输出 1~100之间的不能被 7整除的数 。
for (int i=1; i<=100; i++)
{
if (i%7==0)
continue;
cout << i << endl;
}
当 i被 7整除时, 执行 continue语句, 结束本次循
环, 即跳过 cout语句, 转去判断 i<=100是否成立 。 只
有 i不能被 7整除时, 才执行 cout函数, 输出 i。
C++程序设计 湖南大学 杜四春、银红霞
3.4.3 goto语句
goto语句的语法格式为:
goto 标号;
其中, 标号是一个用户自定义的标识符, 它的命
名规则与变量名的命名规则相同 。 定义标号时, 由一
个标识符后面跟一个冒号组成 。 标号的位置自由, 可
位于 goto语句的前面, 也可位于 goto语句的后面, 但
必须与 goto语句共处于同一函数中 。
goto语句的作用是:结束当前正在执行的循环
( for,while,do… while)或多路分支( switch)程序
结构,转而执行标号所标识的语句。
C++程序设计 湖南大学 杜四春、银红霞
例如:求 1加到 10的总和 。
i=1; sum=0;
loop:
sum+=i++;
if (i<=10)
goto loop;
cout<<“the sum is”<<sum<<endl;
滥用 goto语句将使程序流程无规则、可读性差,
现代程序设计方法主张限制使用 goto语句。用 goto语
句实现的循环完全可用 while或 for循环来表示。一般地,
goto语句只在一个地方有使用价值:当要从多重循环
深处直接跳转到循环之外时,如果用 break语句,将要
用多次,而且可读性并不好,这时 goto可以发挥作用。
C++程序设计 湖南大学 杜四春、银红霞
例 3-8:判断某一年是否是闰年 。
#include "iostream.h"
void main()
{ int year,leap;
cout<<"please input a year:"<<endl;
cin>>year;
if((year%4==0&&year%100!=0)||(year%400==0))
leap=1;
else
leap=0;
if(leap)
cout<<year<<" is a leap year."<<endl;
else
cout<<year<<" is not a leap year."<<endl;
}
最后看一个应用程序:
C++程序设计 湖南大学 杜四春、银红霞
此程序的运行结果为:
please input a year:
2000
2000 is a leap year.
please input a year:
1995
1995 is not a leap year,