该代码用于创建一个功能正常的计算器程序。整个事情有点长,所以我不会进入所有这一切,但这里有一部分:
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变量吗?
答案 0 :(得分:3)
是的,有可能。但是,仍有更多数据需要处理。到目前为止,ch
将只有第一个数字。
例如,如果阅读输入123
,则'1'
字符将被读入ch
。从那里,'1'
将被放回输入,然后整个数字123
将被读入val
。如果未调用cin.putback(ch);
,则返回的Token
将具有值23
而不是123
。
另一种选择是使用ch
中的值,然后以该方式读取其余数字。然而,作者的意图是使用更安全和已经制作的方法来阅读double
。