gpt4 book ai didi

c++ - 为什么 if(!(cin >> int)) 在第一次迭代中接受十进制数而不是其他的?

转载 作者:行者123 更新时间:2023-11-30 01:05:47 24 4
gpt4 key购买 nike

以下程序来自 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 作为输入一样,我会理解,但为什么它表现不同第一个循环和第二个循环不同?

最佳答案

I know how C++ behaves if you assign a double or a float to an int and in this case it outputs the truncated decimal number.

这实际上不是这里发生的事情。没有分配 floatdouble对您的值(value)int .当您尝试输入 5.9 的整数时, 它成功获得了 5位并停在那里,离开.9在输入流中。您在任何阶段都没有提取完整的 5.9来自输入流并将其截断为整数以放入 input_var .

然后,在 迭代中,它找到.9 , 计算出它不是一个有效的整数,并采取相应的行动,与您输入 p 时相同.

这在 C++14 的 22.4.2.1 num_get() 节中有所介绍非常详细,但最重要的是在该描述的第 3 阶段:

The sequence of chars accumulated in stage 2 (the field) is converted to a numeric value by the rules of one of the functions declared in the header <cstdlib>:

For a signed integer value, the function strtoll.

我不会在路上讲太多细节strtoll之所以可行,是因为它还需要逐步执行 ISO C99 的相当多的部分。可以说它结束于 6.4.4 Constants 节其中规定了整数中允许的字符,以及字符 .完全没有出现。

关于c++ - 为什么 if(!(cin >> int)) 在第一次迭代中接受十进制数而不是其他的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47957584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com