C++ 为什么if(!(cin>>int))在第一次迭代中接受十进制数,但在其他迭代中不接受?

C++ 为什么if(!(cin>>int))在第一次迭代中接受十进制数,但在其他迭代中不接受?,c++,if-statement,int,decimal,cin,C++,If Statement,Int,Decimal,Cin,下面的程序来自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-num

下面的程序来自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;
}
如果它是非数字的:

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.

我知道C++是如何在一个int中分配一个双或一个浮点的,在这种情况下它第一次输出截断的十进制数,CIN不会变成假,但是第二次迭代它甚至不接受一个输入。 我可以理解,如果它从一开始就不接受它,或者它只是截断了十进制数,并且表现出与输入int相同的行为,但是为什么它在第一个循环和第二个循环中表现不同呢

我知道C++是如何在一个int中分配一个双或一个浮点的,并且在这种情况下它输出截断的十进制数。

#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;
}
事实上,这里并不是这样。没有为int指定浮点或双精度值。当您尝试输入5.9的整数时,它成功地获得5位并在那里停止,在输入流中留下.9。在任何阶段,您都没有从输入流中提取完整的5.9,并将其截断为整数以放入输入变量

然后,在下一次迭代中,它发现.9,指出它不是一个有效的整数,并相应地执行操作,与输入p时相同

这在C++14第22.4.2.1节“num_get in Extractive Details”中有详细介绍,但底线在该描述的第3阶段:

第2阶段字段中累积的字符序列通过标题中声明的函数之一的规则转换为数值:

对于有符号整数值,函数strtoll

我不会详细介绍strtoll的工作方式,因为它也需要逐步了解ISO C99的许多部分。只需说,它在第6.4.4节常量中结束,该节说明了允许在整数中包含的字符,以及字符的位置。完全没有出现

cin >> input_var;

我知道C++是如何在一个int中分配一个双或一个浮点的,并且在这种情况下它输出截断的十进制数。

#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;
}
事实上,这里并不是这样。没有为int指定浮点或双精度值。当您尝试输入5.9的整数时,它成功地获得5位并在那里停止,在输入流中留下.9。在任何阶段,您都没有从输入流中提取完整的5.9,并将其截断为整数以放入输入变量

然后,在下一次迭代中,它发现.9,指出它不是一个有效的整数,并相应地执行操作,与输入p时相同

这在C++14第22.4.2.1节“num_get in Extractive Details”中有详细介绍,但底线在该描述的第3阶段:

第2阶段字段中累积的字符序列通过标题中声明的函数之一的规则转换为数值:

对于有符号整数值,函数strtoll

我不会详细介绍strtoll的工作方式,因为它也需要逐步了解ISO C99的许多部分。只需说,它在第6.4.4节常量中结束,该节说明了允许在整数中包含的字符,以及字符的位置。完全没有出现

cin >> input_var;
这是运算符>>的操作,该运算符返回cin。然而,当这个cin被传递到一个条件语句时,比如if或当调用istreat的一个特殊函数来计算cin的真值或假值时。此函数检查cin是否遇到和EOR,或者它是否接收到它假定接收的值。请记住>>是一个重载运算符,在您的情况下,该运算符被调用为整数值。但是,当您在本例中输入一个非整数值double时,它会检测并产生一个false

尽管如此,结果不能以相反的方式产生,即当您的输入变量类型为double,并且您输入了一个整数时,cin将其计算为double,但是,cin不会截断int变量小数点后的数字

这是运算符>>的操作,该运算符返回cin。然而,当这个cin被传递到一个条件语句时,比如if或当调用istreat的一个特殊函数来计算cin的真值或假值时。此函数检查cin是否遇到和EOR,或者它是否接收到它假定接收的值。请记住>>是一个重载运算符,在您的情况下,该运算符被调用为整数值。但是,当您在本例中输入一个非整数值double时,它会检测并产生一个false

尽管如此,结果不能以相反的方式产生,即当您的输入变量类型为double,并且您输入了一个整数时,cin将其计算为double,但是,cin不会截断int变量小数点后的数字。

iostreams输入的一个好默认设置是使用标题中的getline。您所说的“十进制数”是什么意思?你是说10垒?因为这是它唯一真正的含义。@EJP它还表示用小数点表示的非整数值。这是我问题中标记小数定义的一部分。很抱歉出现歧义。iostreams输入的一个好的默认设置是从标题使用getline。您所说的“十进制数”是什么意思?你是说10垒?因为这是它唯一真正的含义。@EJP它还表示用小数点表示的非整数值。这是我问题中标记小数定义的一部分。对不起,我说的模棱两可。