以下程序来自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.

我知道如果将doublefloat分配给int,c++的行为,在这种情况下,它第一次输出截断的十进制数,而cin不会变成false,但是第二次迭代它甚至不接受输入。

我会理解它是否从一开始就不接受它,或者它只是截断了十进制并表现出与输入int相同的行为,但是为什么它在第一个循环和第二个循环中表现不同?

最佳答案


这实际上不是这里发生的事情。没有为您的float分配doubleint值。当您尝试输入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节,该节指出了允许的字符以整数表示,并且字符.根本没有出现。

07-26 06:06
查看更多