首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的无限循环

c++中的无限循环
EN

Stack Overflow用户
提问于 2008-11-05 21:06:52
回答 4查看 3.3K关注 0票数 6

我正在学习C++,边走边写小程序。下面是一个这样的程序:

代码语言:javascript
复制
// 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,程序会重复地输出相同的输出。输入的某些组合会导致行为不稳定。例如:

代码语言:javascript
复制
#: ./int2ch
10
10 --> 

10000000000
10 -->

10 -->

10 -->

10 -->

程序会发出"10 -->“,直到它被终止。(对于这种特定的输入序列,程序的输出速度会不稳定地变化。)我还注意到,较大值的输出由先前的合法输入以及当前非法输入的值决定。

到底怎么回事?(我不关心修复程序,这很容易。我想要理解它。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-05 21:14:34

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

代码语言:javascript
复制
#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)“基本上是在说”虽然我仍然可以成功地从标准输入中读取数据,但请执行以下操作“

EDIT:它重复输出输入的最后一个完好值的原因是,这是n中成功读取的最后一个值,失败的读取不会更改n的值

编辑:正如在评论中所指出的,你可以清除错误状态,然后再试一次,像这样的东西可能会起作用,只需忽略错误的数字:

代码语言:javascript
复制
#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
        }
    }
}
票数 13
EN

Stack Overflow用户

发布于 2008-11-05 22:29:58

是的,埃文·特兰已经指出了大部分事情。我想补充的一件事(因为我还不能评论他的评论:)是您必须在调用istream::ignore之前将调用放在istream::clear中。原因是,如果流仍然处于失败状态,istream::ignore同样将拒绝执行任何操作。

票数 5
EN

Stack Overflow用户

发布于 2008-11-05 21:14:05

假设您使用的是一台32位机器,10000000000这个数字太大了,不能用int表示。此外,根据编译器的不同,将int转换为char只能得到0..255或-128..127之间的值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/266665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档