Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个while循环没有以下面的代码结束?_C++_Loops_While Loop - Fatal编程技术网

C++ 为什么这个while循环没有以下面的代码结束?

C++ 为什么这个while循环没有以下面的代码结束?,c++,loops,while-loop,C++,Loops,While Loop,抱歉,这段代码看起来很傻,但我只想了解逻辑 当用户输入quit时,我试图结束程序 我写了name!=“退出”&&sname!=“quit”作为while条件,因此如果其中任何一个是quit,循环将结束(对吗?) 但是当我将quit写为name时,它仍然等待sname输入,如果我也为sname输入写quit,那么它最终会结束。但是,自从我用&&编写条件以来,当它第一次看到退出时,它不应该结束吗 此外,当我使用| |编写条件时,我得到了相同的输出。为什么会这样 int main()

抱歉,这段代码看起来很傻,但我只想了解逻辑

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

我写了
name!=“退出”&&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;
    }

好问题!这与
循环如何工作有关

在C++中,<<代码> 循环工作如下:

  • 首先,它检查
    while
    循环中括号语句中的条件是否为true
  • 如果是这样,它在执行
    循环的同时执行
    的整个循环体,然后跳回到第一步
换句话说,
while
循环不会在条件为false时立即停止运行。相反,一旦到达重新评估条件并发现其为false的点,它就会停止运行

这就是为什么在这里使用
&&
|
并不重要。在再次检查条件之前,循环不会退出,而在当前循环迭代完成运行之前,这种情况不会发生

这就给你留下了一些关于做什么的选择

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

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


  • 希望这有帮助

    因为当您上次在循环运行时输入name=“quit”时。执行while循环中的所有语句。因此姓氏会打印。

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

    while (true) {
        getline(cin, name);
        if (name == "quit") break;
        getline(cin, sname);
        if (sname == "quit") break;
    }
    
    诸如此类的事。:)

    就像医生说的那样:

    istream& getline (istream& is, string& str, char delim);
    
    istream& getline (istream& is, string& str);
    
  • 从is中提取字符并将其存储到str中,直到 找到分隔符delim(或换行符, “\n”,表示(2))

  • 如果在is中到达文件结尾或 在输入操作过程中会发生其他一些错误

  • 如果找到分隔符,将提取并丢弃它(即 未存储,之后将开始下一个输入操作)

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

  • 因此:

    在任何时候使用if条件来中断循环。还可以在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;
    }
    
    #包括
    int main(){
    字符串名称=”,sname=”;
    
    多谢,这帮了大忙,我修复了代码。但我还有一个困惑。
    do-while
    保证语句至少执行一次,即使条件为false。在这种情况下,
    while
    也会执行,直到它重新评估条件,所以即使条件为false,也会再次执行一次一开始是错误的。那么它们实际上有什么不同呢?
    #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;
    }