【发布时间】:2014-01-21 06:44:34
【问题描述】:
为什么输入'q'(或任何字符)
double x;
x = cin.get();
cout << x << endl;
返回输入字符的字符值,但是
double x;
cin >> x;
cout << x << endl;
为 'q' 返回一个随机值
【问题讨论】:
为什么输入'q'(或任何字符)
double x;
x = cin.get();
cout << x << endl;
返回输入字符的字符值,但是
double x;
cin >> x;
cout << x << endl;
为 'q' 返回一个随机值
【问题讨论】:
就像你说的,std::istream::get 从输入流中得到一个字符。例如,如果您输入数字 1 作为输入,它会返回字符 '1' 的 ASCII 代码,即十进制 49(在使用 ASCII 的系统上,这几乎是所有内容)。
当您使用输入运算符>> 时,该函数会读取输入并将输入解析为正确的格式。因此,如果您将>> 与double 变量一起使用,并输入1,您将在变量中获得值1.0。
您遇到的问题是当输入运算符>> 无法正确解析输入时,例如当您输入字母而不是数字时,输入运算符将失败并且不会设置变量,这意味着您打印一个未初始化的变量,它是未定义的行为。请注意,这种行为在 C++11 中发生了变化(参见例如 this old answer of mine)。
您必须记住,流对象可以用作条件,并且输入运算符函数返回有问题的流。所以你可以做例如
if (std::cin >> x)
std::cout << x << '\n';
else
std::cout << "Error in input\n";
【讨论】:
std::get() 将输入读取为 unformatted 整数值,因此它可以成功,因为它不必将读取的内容格式化为任何 特定 类型。但是operator>> 将输入读取为 格式化 数据,因此它必须将读取的内容格式化为给定类型。由于在您的情况下,输入 'q' 不适合 double,因此格式化失败。
【讨论】: