为什么这个while循环没有在下面的代码中结束?

时间:2020-05-26 18:29:27

标签: c++ loops while-loop

对不起,这段代码看起来很愚蠢,但我只想了解逻辑。

当用户输入quit作为输入时,我试图结束程序。

我将name != "quit" && sname != "quit"写为while条件,因此如果其中任何一个为quit,循环将结束(对吗?)。

但是当我将quit写为name时,它仍然等待sname输入,如果我也为sname输入写退出,那么它最终会结束。但是,自从我用quit编写条件以来,它第一次看到&&时就结束了吗?

此外,当我用||编写条件时,我得到相同的输出。为什么会这样?

    int main()
    {
        string name="",sname="";
        cout << "enter your name and surname \n";

            cout << ">>name=";
            getline(cin,name);

            cout << ">>surname=";
            getline(cin,sname);

       while (name != "quit" && sname != "quit")
        {
            cout << ">>name=";
            getline(cin,name);

            cout << ">>surname=";
            getline(cin,sname);
        }

        return 0;
    }

输出:

enter your name and surname
>>name=John
>>surname=Wick
>>name=quit
>>surname=

4 个答案:

答案 0 :(得分:5)

好问题!这与while循环的工作方式有关。

在C ++中,while循环的工作方式如下:

  • 首先,它检查while循环中带括号的语句中的条件是否为真。
  • 如果是,它将执行 while循环的整个过程,然后跳回到第一步。

换句话说,一旦条件为假,while循环就不会停止运行。相反,一旦到达重新评估条件并发现错误的条件,它将停止运行。

这就是为什么在这里使用&&||都没关系的原因。直到再次检查条件后,循环才会退出,直到当前循环迭代运行完毕,循环才会发生。

这为您提供了一些有关操作的选择。

  1. 在读取第一个字符串后,可以在while循环中添加显式检查,以确认该字符串不是"quit",仅在需要时执行循环的其余部分

  2. 您可以在循环的中间添加一个break语句,以告知循环停止运行。可以与选项(1)结合使用。

希望这会有所帮助!

答案 1 :(得分:2)

在while循环中,每次输入双方名字和姓氏后,都会进行一次检查,这意味着它也将在您输入姓氏后才进行检查。您可以这样做:

while (true) {
    getline(cin, name);
    if (name == "quit") break;
    getline(cin, sname);
    if (sname == "quit") break;
}

类似的东西。 :)

答案 2 :(得分:1)

就像医生说的那样:

istream& getline (istream& is, string& str, char delim);

istream& getline (istream& is, string& str);
  1. 从is中提取字符并将其存储到str中,直到 找到定界字符delim(或换行符, '\ n',代表(2))。

  2. 如果在is中到达文件末尾或如果 输入操作期间发生其他错误。

  3. 如果找到分隔符,则将其提取并丢弃(即 未存储,下一个输入操作将在此之后开始。

  4. 请注意,调用之前str中的任何内容都将替换为 新提取的序列。

所以:

在任何时候有条件中断循环时使用。还要在getline中指定结束字符(可选,但要写出)。最后,修剪字符串:

#include <boost/algorithm/string.hpp>

int main() {
  string name = "", sname = "";
  cout << "enter your name and surname \n";

  while (true) {
    cout << "name: ";
    getline(cin, name, "\n");
    name = trim(name);    
    if (name == "quit") break;

    cout << "surname: ";
    getline(cin, sname, "\n");
    sname = trim(sname); 
    if (sname == "quit") break;

  };

  return 0;
}

答案 3 :(得分:0)

因为当您输入名称=“ quit”时,这是上一次循环运行的时间。并且while循环内的所有语句都将执行。所以会打印出姓氏。