C++ 为什么需要将某些内容返回到输入流?

C++ 为什么需要将某些内容返回到输入流?,c++,C++,该代码用于创建一个功能正常的计算器程序。整件事有点长,所以我不想全部讨论,但这里有一部分: Token Token_stream::get() { if (full) { // do we already have a Token ready? full = false; // remove Token from buffer return buffer; } char ch; cin >> ch; // note th

该代码用于创建一个功能正常的计算器程序。整件事有点长,所以我不想全部讨论,但这里有一部分:

Token Token_stream::get()
{
    if (full) { // do we already have a Token ready?
        full = false; // remove Token from buffer
        return buffer;
    }
    char ch;
    cin >> ch; // note that >> skips whitespace (space, newline, tab, etc.)

    switch (ch) {
        case ';': // for “print”
        case 'q': // for “quit”
        case '(': case ')': case '+': case '–': case '*': case '/':
            return Token{ch}; // let each character represent itself
        case '.':
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':
        {   
            cin.putback(ch); // put digit back into the input stream
            double val;
            cin >> val; // read a floating-point number
            return Token{'8',val}; // let ‘8’ represent “a number”
        }
        default:
            error("Bad token");

    }
}

为什么需要将ch放回输入流?难道你不能只使用ch输入而不使用一个全新的变量val吗

是的,这是可能的。然而,还有更多的数据需要处理。到那时为止,
ch
将只有第一个数字

例如,如果读取输入
123
,则
'1'
字符将被读入
ch
。从那里,将
'1'
放回输入,然后将整个数字
123
读入
val
。如果
cin.putback(ch),则返回的
令牌将具有
23
值,而不是
123


另一种选择是使用
ch
中的值,然后以这种方式读取数字的其余部分。然而,作者的意图是使用更安全且已经制作好的方法来读取
双精度

呃,对不起,我还是有点困惑。当您输入123时,只有“1”会读入ch?或者它会继续,读1,放回,读2,放回,等等。在这种情况下,为什么我不能完全摆脱0-9的情况,依靠cin>>val?@blueyfooey
当你输入123时,只有“1”会读入ch?
是的。从那时起,它知道下一个标记是一个数字,所以它读入
123
。在此之后,通过读取数字,输入已超过
123
。然后它会处理下一步发生的事情。好吧,这是有道理的。但是,在这一点上使用cin>>val不是更简单吗?@blueyfooey您首先必须验证那里是否有一个数字。例如,如果
ch
读入字母
'a'
,它会如何处理?它肯定不是一个数字,因此必须显示
“坏令牌”
错误。如果有人输入125a会发生什么?既然第一个数字是1,程序会不会假设从1开始,其他一切都只是一个数字?另外,我的最后一个问题是,如果你不把数字放回输入流,它会去哪里,为什么不被访问?