假设我有以下变量定义,我尝试从标准输入读取值。
int ia = 3;
double da = 0;
std::cin >> ia >> da;
现在,我在标准输入-4.23 -5.01
如果我现在打印ia
和da
,则da
为.23,ia
为-4。
为什么C ++将-4.23分成整数组件和浮点组件,换句话说为什么.23留在输入流中用于后续读取?不会将-4.23简单地截断为-4然后读入ia
?
现在是一个不同的场景,假设我有与上面相同的代码,但这次我输入数字.23
到标准输入流(只是控制台)ia
存储0 (好吧这似乎遵循上面的行为)但是这次da
包含0?在这种情况下似乎0.23
被截断并以0读入,而.23没有像上面那样读入da
。
我无法理解在这些情况下应该发生什么。这里发生了两件不同的事情。
答案 0 :(得分:1)
为什么C ++将-4.23分成整数分量和浮点分量,换句话说为什么.23保留在后续流的输入流中。
你告诉流输入将包含一个整数和一个double,并且在将输入解析为你指定的内容时它做得最好。
该流开始阅读int
,阅读-4
,意识到当它看到一个点.
时,它无法在读取数字时取得进一步进展,并停在此处。之后你告诉C ++读一个双。它看到.23
后跟一个空格,并将其解释为完全合法的double
值。
假设我有与上面相同的代码,但这次我在标准输入流(只是控制台)中输入数字.23
ia
存储0(好吧这似乎遵循以上行为)但是这次da
包含0
这是因为当您要求输入整数时,流无法合法地将任何内容解析为ia
。这会使流进入错误状态,这意味着在错误标志被重置之前不能再进行输入。
答案 1 :(得分:1)
std::cin >> ia
跳过任何空格字符。然后,它尝试从int
中提取std::cin
。如果找到一个不能用作int
一部分的字符,它就会停止。
在您的情况下,.
之后的-4
不能用作int
的一部分。因此,提取在那里停止。之后.23 -5.01
仍留在流中。
然后踢出>> da
部分。由于.23
是有效的double
,因此会被提取并存储在da
中。提取在空白处停止。之后,-5.01
仍留在输入流中。
答案 2 :(得分:0)
易。你告诉代码输入一个十进制值,它确实如此。 '。'在-4.23
中不是整数,所以它停止并为整数分配“-4”。
流指针位于“.23”,这是一个有效的double
个数字;所以它将所有空间分配给变量。所以你的double
变量包含“.23”。
尝试更改变量,使它们属于同一类型或更改输入数据,以便第一项是整数。