以下程序来自google教程,非常简单,除非输入了十进制数字。
#include <iostream>
using namespace std;
int main() {
int input_var = 0;
do {
cout << "Enter a number (-1 = quit): ";
if (!(cin >> input_var)) {
cout << "You entered a non-numeric. Exiting..." << endl;
break;
}
if (input_var != -1) {
cout << "You entered " << input_var << endl;
}
} while (input_var != -1);
cout << "All done." << endl;
return 0;
}
如果输入是整数(不是-1),则输出:
Enter a number (-1 = quit): 5
You entered 5
Enter a number (-1 = quit):
如果是非数字:
Enter a number (-1 = quit): p
You entered a non-numeric. Exiting...
All done.
这就是应该的工作方式,但是如果它是一个十进制数:
Enter a number (-1 = quit): 5.9
You entered 5
Enter a number (-1 = quit): You entered a non-numeric. Exiting...
All done.
我知道如果将
double
或float
分配给int
,c++的行为,在这种情况下,它第一次输出截断的十进制数,而cin
不会变成false
,但是第二次迭代它甚至不接受输入。我会理解它是否从一开始就不接受它,或者它只是截断了十进制并表现出与输入
int
相同的行为,但是为什么它在第一个循环和第二个循环中表现不同? 最佳答案
这实际上不是这里发生的事情。没有为您的float
分配double
或int
值。当您尝试输入5.9
的整数时,它会成功获取5
位并停在那里,从而将.9
留在输入流中。在任何阶段,您都没有从输入流中提取完整的5.9
并将其截断为整数以放入input_var
。
然后,在下一次迭代中,它找到.9
,找出它不是有效的整数,并按照与输入p
时相同的方式进行操作。
这在C++ 14的22.4.2.1 num_get()
节中进行了详细介绍,但最重要的是该描述的第3阶段:
我不会过多介绍strtoll
的工作方式,因为它也需要逐步通过ISO C99的许多部分。可以说它结束于6.4.4 Constants
节,该节指出了允许的字符以整数表示,并且字符.
根本没有出现。