当前位置: 首页 > article >正文

C++Primer 控制流

欢迎阅读我的 【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循环的总体执行流程:

  1. 创建变量val,将其初始化为1。

  2. 检测val是否小于等于10。若检测成功,执行for循环体。若失败,退出循环,
    继续执行for循环体之后的第一条语句。

  3. 将val的值增加1。

  4. 重复第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。


http://www.kler.cn/a/458492.html

相关文章:

  • Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined
  • ​​​​​​​CDP集群安全指南系列文章导读
  • typescript安装后仍然不能使用tsc,如何解决
  • 一个hive插入数据失败的问题
  • SQL 中复杂 CASE WHEN 嵌套逻辑优化
  • Oracle 23ai 图形界面安装
  • Element-ui的使用教程 基于HBuilder X
  • 数据仓库工具箱—读书笔记02(Kimball维度建模技术概述04、使用一致性维度集成)
  • LabVIEW化工实验室设备故障实时监测
  • 【Linux】:Linux套接字Socket网络编程
  • Dockerfile基本原理
  • 解决springdoc-openapi-ui(Swagger3)跳转默认界面问题
  • 关于 PCB线路板细节锣槽问题 的解决方法
  • c# WaitSleepJoin状态的线程如何自动恢复
  • ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标
  • 改变HTML元素的方式有哪些?如何在HTML中添加/替换或删除元素?
  • 微服务保护-sentinel
  • 大模型-Ollama使用相关的笔记
  • 网络:常用的以太网PHY芯片
  • Shader数学基础16-齐次除法
  • sql group by 多个字段例子
  • 《2023-2024网络安全产业发展核心洞察与趋势预测》
  • 使用PyTorch进行自动微分
  • Effective C++ 条款 20:宁以 pass-by-reference-to-const 替换 pass-by-value
  • C++ 设计模式:单例模式(Singleton Pattern)
  • 如何使用爬虫工具Selenium