C++ 这个代码段中的while循环是如何工作的?

C++ 这个代码段中的while循环是如何工作的?,c++,C++,这是我在一本书中找到的代码片段: #include <iostream> int main() { // currVal is the number we're counting; we'll read new values into val int currVal = 0, val = 0; // read first number and ensure that we have data to process if (std::cin >> currVal)

这是我在一本书中找到的代码片段:

#include <iostream>
int main()
{
    // currVal is the number we're counting; we'll read new values into val
int currVal = 0, val = 0;
// read first number and ensure that we have data to process
if (std::cin >> currVal) {
    int cnt = 1;  // store the count for the current value we're processing
    while (std::cin >> val) { // read the remaining numbers
        if (val == currVal)   // if the values are the same
            ++cnt;            // add 1 to cnt
        else { // otherwise, print the count for the previous value
            std::cout << currVal << " occurs "
                      << cnt << " times" << std::endl;
            currVal = val;    // remember the new value
            cnt = 1;          // reset the counter
        }
    }  // while loop ends here
    // remember to print the count for the last value in the file
    std::cout << currVal <<  " occurs "
              << cnt << " times" << std::endl;
} // outermost if statement ends here
return 0;
}
#包括
int main()
{
//currVal是我们正在计算的数字;我们将把新值读入val
int currVal=0,val=0;
//读取第一个数字并确保我们有数据要处理
如果(标准::cin>>当前值){
int cnt=1;//存储我们正在处理的当前值的计数
而(std::cin>>val){//读取剩余的数字
if(val==currVal)//如果值相同
++cnt;//将1添加到cnt
else{//否则,打印上一个值的计数
std::cout
while(std::cin>>val)
将循环,直到
cin
进入不再有效的状态。使用Ctrl+D发送EOF字符,该字符导致设置
cin
EOF
标志,并使其评估为
false
结束循环

1234a
的输入基本上做了相同的事情。当您在
cin
需要一个数字时输入一个字母,它会导致输入失败,设置
cin
fail
标志。这也会导致
cin
计算为
false
并结束循环


解决这一切的一种方法是使用
std::string
并一次性获取所有输入。然后您可以将该
std::string
加载到
std::stringstream
中,并从中获取各个元素

std::string line;
std::getline(cin, line)
std::stringstream ss(line);
while (ss >> val)
{
    //...
}
while(std::cin>>val)
将循环,直到
cin
进入不再有效的状态。使用Ctrl+D发送EOF字符,使
cin
EOF
标志被设置,并使其评估为
false
结束循环

1234a
的输入基本上做了相同的事情。当您在
cin
需要一个数字时输入一个字母,它会导致输入失败,设置
cin
fail
标志。这也会导致
cin
计算为
false
并结束循环


解决这一切的一种方法是使用
std::string
并一次性获取所有输入。然后您可以将该
std::string
加载到
std::stringstream
中,并从中获取各个元素

std::string line;
std::getline(cin, line)
std::stringstream ss(line);
while (ss >> val)
{
    //...
}

还有一件事,ctrl-D保证只在行首正常工作,所以如果它真的取决于控制台,程序会如何对它作出反应,如果它是在这些数字之后输入的。一般来说,人们应该单独输入它们…4和ctrl-D可能会不同步。在这种情况下,它基本上意味着:刷新输入缓冲区。如果输入缓冲区是空的,然后它被当作EOF。@ Swift Frayay馅饼——为了清楚地了解边界,C++语言不能保证任何关于CTRL的任何东西,不管它在输入中的位置。它完全由控制台来解释,并且你对一行的开始的评论是关于一个特定的控制台实现。@ PeteBecker I NeVEr表示它是14882的一部分。它与环境有关(POSIX等)除了C++,tbh,我不确定哪个协议或文档管理POSIX控制台。在非POSIX CTRL D上可能根本不起作用。谢谢大家。我似乎没有提供足够的例子。我不知道如何最好地描述我当前的问题。但是为什么呢?它似乎需要在输入最后的值之前输入……也就是CTR。l-D保证只在行首正常工作,所以如果它真的取决于控制台,程序将如何对它作出反应,如果它是在这些数字之后输入的。一般来说,人们应该分别输入它们…4和ctrl-D可能会不同步。在这种情况下,它本质上意味着:刷新输入缓冲区。如果输入缓冲区是空的,那么它就是treaTwift FrayayPes——为了清楚地了解边界,C++语言不能保证任何关于CTRL的任何东西,不管它在哪里输入。它完全由控制台来解释,并且你对一个行的开始的评论是关于一个特定的控制台实现。@ PeteBecker我从来没有打算它是1的一部分。4882.它与环境有关(POSIX等)除了C++,tbh,我不确定哪个协议或文档管理POSIX控制台。在非POSIX CTRL D上可能根本不起作用。谢谢大家。我似乎没有提供足够的例子。我不知道如何最好地描述我当前的问题。但是为什么呢?它似乎需要在显示最后的值之前输入输入……你认为应该怎么办?当你输入“1234”时会发生什么?你认为当你输入“1234”时会发生什么?