C++Primer 控制流
专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!
目录
- 1.4控制流
- while语句
- for语句
- 读取数量不定的输人数据
- if 语 句
1.4控制流
语句一般是顺序执行的:语句块的第一条语句首先执行,然后是第二条语句,依此类推。当然,少数程序,包括我们解决书店问题的程序,都可以写成只有顺序执行的形式。但程序设计语言提供了多种不同的控制流语句,允许我们写出更为复杂的执行路径。
while语句
while语句反复执行一段代码,直至给定条件为假为止。我们可以用while语句编写一段程序,求1到10这10个数之和:
#include<tostream>
int main()
{
int_Stum二0,Val二工;
//只要val的值小于等于10,while循环就会持续执行
while(val<=10){
sum+=val;
++val;//将val加1
}
std::cout << “Sum of 1 to 10 inclusive is “ << sum << std::endl;
return 0;
}
我们编译并执行这个程序,它会打印出
Sum of 1 to 10 inclusive is 55
与之前的例子一样,我们首先包含头文件iostream,然后定义main。在main中我们定义两个int变量:sum用来保存和;val用来表示从1到10的每个数。我们将sum的初值设置为0,val从1开始。
这个程序的新内容是while语句。while语句的形式为
while (condiion)
statement
while语句的执行过程是交替地检测condition条件和执行关联的语句statement,直至condition为假时停止。所谓条件(condition)就是一个产生真或假的结果的表达式。只要condiion为真,statement就会被执行。当执行完statememt,会再次检测condition。如果conditon仍为真,statement再次被执行。while语句持续地交替检测condition和执行statenent,直至condition为假为止。
在本程序中,while语句是这样的
//只要val的值小于等于10,while徨环就会持续执行
while(val<=10){
sum+=val;“//将sum+val贿二sum
++Val//将val加1
}
条件中使用了小于等于运算符(<=)籼比较val的当前值和10。只要val小于等于10,条件即为真。如果条件为真,就执行while循环体。在本例中,循环体是由两条语句组成的语句块:
{
sum+=val;//将sum+val贿予Sum
++val;//将val加1
}
所谓语句块(block),就是用花括号包围的零条或多条语句的序列。语句块也是语句的一种,在任何要求使用语句的地方都可以使用语句块。在本例中,语句块的第一条语句使用了复合赋值运算符(+=)。此运算符将其右侧的运算对象加到左侧运算对象上,将结果保存到左侧运算对象中。它本质上与一个加法结合一个赋值(assignment)是相同的:
sum=sum+val; //将sum+val赋予sum
因此,语句块中第一条语句将val的值加到当前和sum上,并将结果保存在sum中。
下一条语句
++val; //将 val 加 1。
使用前缀递增运算符(++)。递增运算符将运算对象的值增加1。++val等价于
val = val+1。
执行完while循环体后,循环会再次对条件进行求值。如果val的值(现在已经增加了)仍然小于等于10,则while的循环体会再次执行。循环连续检测条件、执行循环体,直至val不再小于等于10为止。
一旦val大于10,程序跳出while循环,继续执行while之后的语句。在本例中,继续执行打印输出语句,然后执行return语句完成main程序。
for语句
在我们的while循环例子中,使用了变量val来控制循环执行次数。我们在循环条件中检测val的值,在while循环体中将val递增。
这种在循环条件中检测变量、在循环体中递增变量的模式使用非常频繁,以至于C++语言专门定义了第二种循环语句一一for语句,娄简化符合这种模式的语句。可以用for语句来重写从1加到10的程序:
#include<iostreami>
int main()
{
intsum二0;
//从1加到10
for(int val=1;val < 10;++val)
sum += Val; // 等 价 于 sum = sum + val
std: :cout <<“Sum of 1 to 10 inclusive is “ << sum << std: :endl;
return 0;
}
与之前一样,我们定义了变量sum,并将其初始化为0。在此版本中,val的定义是for语句的一部分:
for(int val = 1;val<=10;++val)
sum+Val;
每个for语句都包含两部分:循环头和循环体。循环头控制循环体的执行次数,它由三部分组成:一个初始化吾句(init-statement)、一个循环(condition)一个表达式(expyession)。在本例中,初始化语句为
int val =1;
它定义了一个名为val的int型对象,并为其赋初值1。变量val仅在for循环内部存在,在循环结束之后是不能使用的。初始化语句只在for循环入口处执行一次。循环条件
val<=10
比较val的值和10。循环体每次执行前都会先检查循环条件。只要val小于等于10,就会执行for循环体。表达式在for循环体之后执行。在本例中,表达式
++val
使用前缀递增运算符将val的值增加1。执行完表达式后,for语句重新检测循环条件。如果val的新值仍然小于等于10,就再次执行for循环体。执行完循环体后,再次将val的值增加1。循环持续这一过程直至循环条件为假。
在此循环中,for循环体执行加法
sum+=val;//等价于sum二sum+val
简要重述一下for循环的总体执行流程:
-
创建变量val,将其初始化为1。
-
检测val是否小于等于10。若检测成功,执行for循环体。若失败,退出循环,
继续执行for循环体之后的第一条语句。 -
将val的值增加1。
-
重复第2步中的条件检测,只要条件为真就继续执行剩余步骤。
读取数量不定的输人数据
在前一节中,我们编写程序实现了1到10这10个整数求和。扩展此程序一个很自然的方向是实现对用户输入的一组数求和。在这种情况下,我们预先不知道要对多少个数求和,这就需要不断读取数据直至没有新的输入为止:
#include<iostream>
intmain()
{
int sum=0,value=0; //读取数据直到遇到文件尾,计算所有读入的值的和
while(std::cin>>value){
sum+=value;//等价于sum=sum+value
std::cout<<“Sumis:“<<Sum<<std::endl;
}
return 0;
}
如果我们输入
3 4 5 6
则程序会输出
sum is: 18
main的首行定义了两个名为sum和value的int变量,均初始化为0。我们使用value保存用户输入的每个数,数据读取操作是在while的循环条件中完成的:
while(std::cin>>Value)
while循环条件的求值就是执行表达式
std::cin>>value
此表达式从标准输入读取下一个数,保存在value中。返回其左侧运算对象,在本例中是std::cin。因此,此循环条件实际上检测的是 std::cin。
当我们使用一个istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-offile),或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假。
因此,我们的while循环会一直执行直至遇到文件结束符(或输入错误),while循环体使用复合赋值运算符将当前值加到sum上。一旦条件失败,while循环将会结束。我们将执行下一条语句,打印sum的值和一个endl。
if 语 句
与大多数语言一样,C++也提供了f语句来支持条件执行。我们可以用if语句写一个程序,来统计在输入中每个值连续出现了多少次:
#include<iostream>
int main()
{
//currVal是我们正在统计的数;我们将读入的新值存入val
int currVal=0,val=0;
//读取第一个数,并确保确实有数据可以处理
if (stdi cin >> curFVal) {
int cnt = 1 ; // 保存我们正在处理的当前值的个数
while(std::cin>>val)〔//读取剩余的教
if(val==currVal)//如果值相同
++cnt;//将cnt加1
else{//否则,打印前一个值的个数
std::cout<<curFVal<<“occurs“<<cnt<<“times“<<std::endl;
cuzzVal=val;//记住新值
cnt=1//重置计数器
}
}//while循环在这里结束
//记住打印文件中最后一个值的个数
std::cout<<curFVal<<“occurs“<<cnt<<“times“<<std::endl;
}//最外层的if语句在这里结束
return0;
}
如果我们输入如下内容:
42 42 42 42 42 55 55 62 100 100 100
则 输出应该是:
42 occurs 5 times
55 occurs 2 times
62 occcurs 1 times
100 occurs 3 times
有了之前多个程序的基础,你对这个程序中的大部分代码应该比较熟悉了。程序以两个变量val和currVal的定义开始,currVal记录我们正在统计出现次数的那个数;val则保存从输入读取的每个数。与之前的程序相比,新的内容就是两个if语句。第一条if语句
if (std::cin >> CurFVal) {
//...
} // 最外层的if语句在这里结束
保证输入不为空。与while语句类似,if也对一个条件进行求值。第一条if语句的条件是读取一个数值存入currVal中。如果读取成功,则条件为真,我们继续执行条件之后的语句块。该语句块以左花括号开始,以return语句之前的右花括号结束。
如果需要统计出现次数的值,我们就定义cnt,用来统计每个数值连续出现的次数。
与上一小节的程序类似,我们用一个while循环反复从标准输入读取整数。
while的循环体是一个语句块,它包含了第二条if语句:
if(val==_currVal)//如果值相同
++cnt}//将cnt加1
else{//否则,打印前一个值的个数
std::cout<<curFVal<<“occurs“<<cnt<<“times“<<std::endl;
curVal=val;///预冒′(寅-7妻fr{直
cnt=1//重置计数器
}
这条if语句中的条件使用了相等运算符(==)来检测val是否等于currVal。如果是,我们执行紧跟在条件之后的语句。这条语句将cnt增加1,表明我们再次看到了currVal。如果条件为偿,即val不等于currVal,则执行else之后的语句。这条语句是一个由一条输出语句和两条赋值语句组成的语句块。输出语句打印我们刚刚统计完的值的出现次数。赋值语句将cnt重置为1,将currVal重置为刚刚读入的值val。