• Index

循环语句

Reads: 22

while

while的条件是true时,将一直执行{}中的代码,直到条件变成false

while (true或者false)
{
    // 执行代码
} // 执行到这里会跳回上面的while (true或者false) 重新判断

基础示例

问题:反转输出字符串Hello World。代码中back()pop_back()都是字符串的成员函数。

#include <iostream> // std::cout std::endl

int main(void)
{
    std::string text = "Hello World"; // 字符串Hello World

    // 从后面输出字符后删除, 直到字符串没有字符为止
    while (!text.empty()) // 字符串不是空, 即字符串还有字符时循环
    {
        std::cout << text.back(); // 输出字符串最后一个字符
        text.pop_back(); // 删除字符串最后一个字符
    }
    std::cout << std::endl;

    return 0;
}

do while

while的条件是true时,将一直执行{}中的代码,直到条件变成false

do
{
    // 执行代码
} while (true或者false); // 执行到这里如果条件成立则跳回去上面的do重新执行

所以,do while至少执行一次代码。

注意do while最后是有分号;的。

基础示例

问题:一直提示用户输入一个1位数字,直到用户输入一个1位数字为止,即用户输入其他字符则一直提示用户。

#include <iostream> // std::cin std::cout std::endl
#include <string> // std::string
#include <cctype> // std::isdigit

int main(void)
{
    std::string text;
    do
    {
        std::cout << "请输入一个1位数字:";
        std::cin >> text;
    } while (text.size() != 1 || !std::isdigit(text.front()));
    std::cout << "你输入的是:" << text.front() << std::endl;
    return 0;
}

基础讲解

代码中,字符串的成员函数front()用来获取字符串的第一个字符。由于在终端输入数据时,只有真的有输入数据才会结束std::cin,所以,字符串text至少有一个字符。所以不怕字符串没有字符然后调用front()而出错。

函数std::isdigit()用来判断字符是不是数字字符,如果不是则返回0(即false),如果是数字字符则返回非0(即true)。它在cctype标准库中。

do while先执行一次{}中的代码再判断。然后判断,如果输入不止一个字符或者第一个字符不是数字字符则继续执行循环。

在最后,当输入数字字符后则输出该数字字符。

for

for循环有两种形式。

第一种形式,就是前面教程讲解过的这个:

for (int i = 0; i < 10; ++i)
{
    // 执行10次代码
}

上面的变量i作用域只在for循环里面。他的执行顺序是:循环之前先执行初始化语句,然后判断条件,成立则开始执行,执行完后就执行++i,执行完++i之后就判断条件,然后如此循环。

下面是在范围内执行循环,变量也是只作用在该循环内:

for (数据类型 变量 : 带范围的变量)
{
    // 执行代码
}

死循环

死循环就是卡在循环里出不来。←_←

while语句的死循环:while (true);

for语句的死循环:for (;;);

continue、break 和 goto

这三个关键字在循环中都是非常常用的。

continue在循环中是跳过一次循环。break在循环中是跳出一个循环。而goto一般用于跳出多重循环。

基础示例

问题:第一行输出Hello World中的第一个单词,第二行将Hello World中空格的不输出,除空格以外的字符都加1。

#include <iostream> // std::cin std::cout std::endl
#include <string> // std::string
#include <cctype> // std::isdigit

int main(void)
{
    const std::string text = "Hello World";

    // 范围内的for循环, 即遍历字符串每一个字符
    for (auto ch : text)
    {
        // 当发现有空格时就跳出循环就可以输出第一个单词
        // 如果字符串只有一个单词没有空格, 则输出每个字符, 同样也是输出一个单词
        if (ch == ' ')
        {
            break; // 跳出循环
        }
        std::cout << ch;
    }
    std::cout << std::endl;

    // 遍历字符串每一个字符, 当出现空格则不处理, 其他字符则加一
    for (auto ch : text)
    {
        if (ch == ' ')
        {
            continue; // 跳回到上面for那里, 即跳过本次循环
        }
        std::cout << static_cast<char>(ch + 1); // char加int就是int, 所以要转换
    }
    std::cout << std::endl;

    return 0;
}

输出结果:

Hello
IfmmpXpsme

基础示例

问题:1元、2元、5元,可以凑成20元的可能情况,一种即可,而且1元、2元、5元各至少1张。

#include <iostream> // std::cin std::cout std::endl
#include <string> // std::string
#include <cctype> // std::isdigit

int main(void)
{
    unsigned int count1 = 1; // 1元的数量
    unsigned int count2 = 1; // 2元的数量
    unsigned int count5 = 1; // 5元的数量

    for (unsigned int count1 = 1; count1 <= 20; ++count1) // 1元的数量, 最20张就20元
    {
        for (unsigned int count2 = 1; count2 <= 10; ++count2) // 2元的数量, 最多10张就20元
        {
            for (unsigned int count5 = 1; count5 <= 4; ++count5) // 5元的数量, 最多4张就20元
            {
                // 由于只需要1种情况即可, 所以符合条件就跳出循环, 更省时间
                if (1 * count1 + 2 * count2 + 5 * count5 == 20)
                {
                    std::cout << "1元:" << count1 << " 2元:" << count2 << " 5元:" << count5 << std::endl;
                    goto EXIT; // 由于break只能跳出最近的循环, 这里有三重循环, 所以要用goto
                }
            }
        }
    }
    EXIT: // 这个是你自己定义的标识符

    return 0;
}

输出结果:

1元:1 2元:2 5元:3

基础讲解

使用goto前需要自己定义一个标识符,代码中是EXIT。然后标识符后面需要加冒号:。这样,就可以用goto 标识符;跳到标识符EXIT的位置,然后接着执行标识符后面的代码。由于标识符后面没有代码,所以就退出程序了。

注意goto推荐的用法仅用于此,goto虽然可以用在很多地方,但是那些用法已经过时,会导致程序难读。

补充知识(了解即可)

  1. 在范围内循环的for可以使用结构化绑定声明,它从C++17开始加入。结构化绑定声明将在后面函数中讲解。
  2. 在不按标准的VC6.0 IDE中,for (int i = 0; i < 10; ++i);i的作用域不只在for里面。
  3. 在范围内循环的for从C++11开始加入。

Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.