HOME/CPP Primer/

1.4 控制流

Article Outline
TOC
Collection Outline

1.4 控制流

1.4.1 while语句

while语句反复执行一段代码,直至给定条件为假为止。我们可以用whi1e语句编写一段程序,求1到10这10个数之和:

#include <iostream>
int main()
{
    int sum =0, val =1;
    // 只要va1的值小于等于10,while循环就会持续执行
    while (val <= 10) 
    {
        sum+=val;   //将sum+va1赋予sum
        ++val;      //将va1加1
    }
    std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
    return 0;
}
while(condition) 
    statement

while语句的执行过程是交替地检测condition条件和执行关联的语句statement,直至condition为假时停止。所谓条件(condition)就是一个产生真或假的结果的表达式。只要condition为真,statement就会被执行。当执行完statement,会再次检测condition。如果condition仍为真,statement再次被执行。while语句持续地交替检测condition和执行statement,直至condition为假为止。

1.4.2 for语句

#include <iostream>
int main()
{
    int sum = 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;
}

每个for语句都包含两部分:循环头和循环体。循环头控制循环体的执行次数,它由三部分组成:一个初始化语句、一个循环条件以及一个表达式。

1.4.3 读取数量不定的输入数据

在前一节中,我们编写程序实现了1到10这10个整数求和。扩展此程序一个很自然的方向是实现对用户输入的一组数求和。在这种情况下,我们预先不知道要对多少个数求和,这就需要不断读取数据直至没有新的输入为止:

#include <iostream>
int main()
{
    int sum = 0, value = 0;
    // 读取数据直到遇到文件尾,计算所有读入的值的和
    while(std::cin >> value)
        sum += value;
    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

当我们使用一个istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符,或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效。处于无效状态的 istream对象会使条件变为假。

1.4.4 if语句

与大多数语言一样,C++也提供了if语句来支持条件执行。我们可以用if语句写个程序,来统计在输入中每个值连续出现了多少次:

#include <iostream>
int main()
{
    // currVal是我们正在统计的数;我们将读入的新值存入val
    int currVal = 0, val = 0;
    // 读取第一个数,并确保确实有数据可以处理
    if(std::cin >> currVal)
    {
        int cnt = 1;                // 保存我们正在处理的当前值的个数
        while(std::cin >> val)      // 读取剩余的数
        {                           
            if(val == currVal)      // 如果值相同
                ++cnt;              // 将cnt加1
            else                    // 否则,打印前一个值的个数
            {
                std::cout << currVal << " occurs " << cnt << " times" << std::endl;
                currVal = val;      // 记住新值
                cnt = 1;            // 重置计数器
            }
        } // while循环在这里结束
        // 记住打印文件中最后一个值的个数
        std::cout << currVal << " occurs " << cnt << " times" << std::endl;
    } // 最外层的if语句在这里结束
    return 0;
}