C++中的无限循环

问题描述:

我正在学习C++,并且随着我一起写小程序。以下就是这样一个程序:C++中的无限循环

// This program is intended to take any integer and convert to the 
// corresponding signed char. 

#include <iostream> 

int main() 
{ 
    signed char sch = 0; 
    int n = 0; 
    while(true){ 
    std::cin >> n; 
    sch = n; 
    std::cout << n << " --> " << sch << std::endl; 
    } 
} 

当我运行这个程序,并保持投入,在相当小的绝对值,其行为与预期相同。但是,当我输入较大的输入时,例如10000000000,程序会反复吐出相同的输出。输入的某些组合会导致不稳定的行为。例如:

#: ./int2ch 
10 
10 --> 

10000000000 
10 --> 

10 --> 

10 --> 

10 --> 

该程序吐出“10 - >”直到它死亡。 (使用这种特定的输入序列,程序的输出速度变化速度不规律)。我还注意到,大值的输出由前一个合法输入以及当前非法输入的值决定。

发生了什么事? (我不在意修复这个程序,这很容易,我想理解它。)

基本上,您的cin数据流处于失败状态,因此在您尝试读取数据时会立即返回。重写你的例子是这样的:

#include <iostream> 

int main() 
{ 
    signed char sch = 0; 
    int n = 0; 
    while(std::cin >> n){ 
    sch = n; 
    std::cout << n << " --> " << sch << std::endl; 
    } 
} 

cin >> n将参考返回cin,它可以测试在有条件的“良好性”。所以基本上“while(std::cin >> n)”是说“虽然我仍然可以从标准输入读取成功,执行以下操作”

编辑:它重复输出最后输入的好值的原因是因为这是最后一个值成功读取N,失败的读取不会改变n的值

编辑:在评论指出,可以清除错误状态,然后再试一次这样的事情可能会工作,只是忽略坏的数字:

#include <iostream> 
#include <climits> 

int main() { 
    signed char sch = 0; 
    int n = 0; 
    while(true) { 
     if(std::cin >> n) { 
      sch = n; 
      std::cout << n << " --> " << sch << std::endl; 
     } else { 
      std::cin.clear(); // clear error state 
      std::cin.ignore(INT_MAX, '\n'); // ignore this line we couldn't read it 
     } 
    } 
} 
+0

或者,在std :: cin.clear()中引入一个调用,以在下一次循环之前删除错误状态。 – hark 2008-11-05 21:18:06

鉴于你在32位机器上,10000000000是一个太大的数字来表示一个int。根据编译器的不同,将int转换为char也只会给出0..255或-128..127。

+0

实际上这是0..255或-128..127。 :) – unwind 2008-11-05 21:15:33

这里的一个问题是,char的大小为一个字节,因此可以只保持在-127和128之间的数字。另一方面,int通常是4个字节,并且可以具有更大的值。第二个问题是,即使对于int,您输入的值也太大。

+0

首先打印“一些奇怪的字符”不是原因,其次char是没有默认签名的,这是依赖于编译器的。它经常*签名,但不一定是。 – 2008-11-05 21:18:09

是的,Evan Teran已经指出了大部分事情。我想添加的一件事(因为我不能评论他的评论:))是,你必须打电话给istream :: clear 之前调用istream :: ignore。原因是istream :: ignore同样只会在流仍然处于失败状态时拒绝执行任何操作。

+0

谢谢,纠正。你会得到一个upvote;) – 2008-11-05 22:39:39