干翻全岛蛙蛙 发表于 2024-12-31 01:12:33

C++Primer 控制流

欢迎阅读我的【C++Primer】专栏
专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象办法,使你更加适应高级程序设计技术。希望对读者有帮助!
https://i-blog.csdnimg.cn/direct/11968bb92b404ca7bd9fdfe004b640b1.gif#pic_center
https://i-blog.csdnimg.cn/direct/c7db733f1c744e3abde9f4a47a423631.png#pic_center


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。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C++Primer 控制流