2011-12-07 47 views
2

这是一个小小的设计程序,它打印刚输入到屏幕的整数。在while循环条件C++中使用时std :: cin的行为

#include <iostream> 
int main(int argc, char *argv[]) 
{ 
    int n; 
    while(std::cin>>n) 
    { 
     std::cout<<"You typed "<<n<<std::endl; 
    } 

    return 0; 
} 

现在,当我输入整数时,程序正常工作。但是,如果我输入像10.8这样的浮点数,程序将在屏幕上显示10(因为它应该将浮点数转换为整数),然后程序退出。这是为什么发生?以下是终端输出示例。

Desktop: ./a.out 
4 
You typed 4 
-9 
You typed -9 
10.8 
You typed 10 
Desktop: 
+0

错误的代码格式。不规则排列。 – Nawaz

+1

@Nawaz:你以前从未见过GNU风格的缩进? – Blastfurnace

回答

5

在“您输入10”行后,字符“.8”保留在流中。当它试图将它读入一个整数时,它会失败,所以它会将流置于不良状态。

由于数据流处于不良状态,因此您的循环条件失败,您将无法使用循环。

(具体地讲,它设置了“坏”一点,我想,但它已经太长,因为我处理这一点,我不知道 - 检查的文件,如果你需要的详细程度)

另外:请注意,如果您试图再次阅读,字符“.8”将仍然留在流中,并且您将再次失败。这是一个常见的I/O错误。

+0

你打败了我,但只是澄清:'cin'返回NULL。 NULL == 0,所以循环退出而不用'cout'打印。 – semisight

+0

如果我们深入挖掘低层细节,这是一个隐式转换 - 提取操作符再次返回'cin',然后'cin'被隐式转换为'bool'值。 (如你所说,如果有什么不好的话,那么隐式转换链会经历'void *' - 'NULL')。 – Hurkyl

5

不应该有任何铸件。

将10.8读作10,然后.导致无法将文本解释为整数,导致failbit被设置。这反过来会导致你的循环退出。

如果您想要处理10.8,请阅读double,并自己进行铸造。