澄清std::cin 这是Bjarne Stroustrup用C++语言编写的。我想澄清一下他是如何将数字累加到变量int number_值中的。请不要撕扯代码,我没有写完整的代码,从第6章在文章的底部

澄清std::cin 这是Bjarne Stroustrup用C++语言编写的。我想澄清一下他是如何将数字累加到变量int number_值中的。请不要撕扯代码,我没有写完整的代码,从第6章在文章的底部,c++,stream,C++,Stream,特别是当解析器调用lexer时,lexer如何使用cin建立一个数字。我相信答案就在这八行中,但我想解释一下它是如何工作的 if( isalpha( ch ) ) { (*input).putback( ch ); (*input) >> string_value; return curr_tok=NAME; } else { error( "bad token " ); return curr_tok=PRINT; } 在我看来,第一次调用

特别是当解析器调用lexer时,lexer如何使用cin建立一个数字。我相信答案就在这八行中,但我想解释一下它是如何工作的

if( isalpha( ch ) ) {
    (*input).putback( ch );
    (*input) >> string_value;
    return curr_tok=NAME;
} else {
    error( "bad token " );
    return curr_tok=PRINT;
}
在我看来,第一次调用get_令牌时,它会将完整表达式_列表放入cin或任何输入流中,输入点指向get_令牌内部

(*input) >> ch;
我知道ch被声明为char,但是如果您键入123.4+5.432,会发生什么;假设输入为cin,则cin现在包含其流中包含的字符串123.4+5.432。然后我们转到lexer get_标记中的switch语句。我假设:

ch == 1?
在这一点上?接下来在switch语句中,我们将讨论“.”的情况。在这里,我们将“1”放回流中,并将其写出number\u value

(*input).putback( ch );
(*input) >> number_value;
现在number_value=1,我们返回解析器。因为我们找到了一个号码,它再次调用get_令牌。和cin操作员 现在number_value=1,我们返回解析器

否。*输入>>数字\u值;读取整个double,即123.4,因为number_值是double类型。除此之外,你是对的

现在number_value=1,我们返回解析器


否。*输入>>数字\u值;读取整个double,即123.4,因为number_值是double类型。除此之外,你是对的

这个“把戏”是由以下三行的不同行为造成的:

char ch;                   std::cin >> ch;
std::string string_value;  std::cin >> string_value;
double number_value;       std::cin >> number_value;
第一个只获取一个字符,第二个和第三个获取多个字符以构建正确类型的变量

字符串重载全局运算符>>函数以提供字符串的版本,此版本使用空格作为分隔符如果需要用字符串输入空格,则应查看getline

双精度版本使用istream&operator>>double&val;成员函数,仅当字符在形成双精度值时才读取字符

那么,假设你进入abc。代码cin>>ch将用字符“a”填充ch,将其从输入流中删除。然后,您将在默认情况下使用isapha检测此情况,因为它与其他情况都不匹配

此时,您将该字符“a”推回到输入流,以便可以重新读取它,并执行cin>>string_值,该值获取整个字符串abc,而不是单个字符


类似地,如果您输入3.14159,它将被大小写“3”检查捕获,字符将被推回输入流,然后cin>>number_值将获得整个值。

此“技巧”是由以下三行的不同行为造成的:

char ch;                   std::cin >> ch;
std::string string_value;  std::cin >> string_value;
double number_value;       std::cin >> number_value;
第一个只获取一个字符,第二个和第三个获取多个字符以构建正确类型的变量

字符串重载全局运算符>>函数以提供字符串的版本,此版本使用空格作为分隔符如果需要用字符串输入空格,则应查看getline

双精度版本使用istream&operator>>double&val;成员函数,仅当字符在形成双精度值时才读取字符

那么,假设你进入abc。代码cin>>ch将用字符“a”填充ch,将其从输入流中删除。然后,您将在默认情况下使用isapha检测此情况,因为它与其他情况都不匹配

此时,您将该字符“a”推回到输入流,以便可以重新读取它,并执行cin>>string_值,该值获取整个字符串abc,而不是单个字符


类似地,如果您输入3.14159,它将被大小写“3”检查捕获,字符将被推回输入流,然后cin>>number\u值将获得整个值。

所以它会一直读取直到找到空白?我记得读到>>一直读到它找到空白,在那里as while cin.get ch&!isalpha ch{;}会一直读到找到第一个非数字?@Matthew;否。流运算符将最多读取与正在读取的类型不匹配的第一个字符。因此它将一直读取,直到找到空白为止?我记得读到>>一直读到它找到空白,在那里as while cin.get ch&!isalpha ch{;}会一直读到找到第一个非数字?@Matthew;否。流运算符将最多读取不适合所读取类型的第一个字符。