【问题标题】:C++ - Simple - nested while loops never terminate?C++ - 简单 - 嵌套的while循环永远不会终止?
【发布时间】:2015-02-24 09:51:44
【问题描述】:

我只是在为 C++ 修改一些文件 i/o。 编写一个程序,在没有 cmets 的情况下将自己的源代码打印到终端

这里是有问题的循环使用 if 语句

while (!inputstream.eof())
{
 if(in_comment == false)
    {
      inputstream.get(temp);
      if(temp == '/')
        {
          inputstream.get(temp1); 
          if (temp1 == '*')
            {
              in_comment = true;

            }
          else
            {
              inputstream.putback(temp1);
            }
        }

      cout << temp;
    }

  if(in_comment == true)
    {
      inputstream.get(temp);
      if(temp == '*')
        {
          inputstream.get(temp); 
          if (temp == '/')
            {
              in_comment = false;
            }
        }
    }
}

这里他们不使用 while 循环

while (!inputstream.eof())
{
 while(in_comment == false)
    {
      inputstream.get(temp);
      if(temp == '/')
        {
          inputstream.get(temp1); 
          if (temp1 == '*')
            {
              in_comment = true;
             break;
            }
          else
            {
              inputstream.putback(temp1);
            }
        }

      cout << temp;
    }

  while(in_comment == true)
    {
      inputstream.get(temp);
      if(temp == '*')
        {
          inputstream.get(temp); 
          if (temp == '/')
            {
              in_comment = false;
            }
        }
    }
}

我原以为 eof 标记会导致程序跳出外部 while 循环,但事实并非如此。这是为什么呢?

谢谢

【问题讨论】:

  • 编译时包含所有警告和调试信息 (g++ -Wall -Wextra -g)。然后使用调试器 (gdb)
  • 您是否期望外部 while 被破坏而内部 while 仍在运行?如果是这样,那是你的问题。它只检查每个循环开始时的条件!inputstream.eof():如果外循环永远没有机会开始,它将无法检查。
  • Basile Starynkevitch 也有一个非常好的建议——学会用好调试器!使用变量 watch 逐行遍历您的代码非常非常有帮助。 (如果你使用 IDE,它几乎肯定有一个调试器。)

标签: c++ file-io while-loop eof


【解决方案1】:

您的内部循环不会在 eof 上中断,因此您会得到一个无限循环 - 就这么简单。仅当留下内部循环时,外部循环才有机会中断。 工作示例没有内循环,因此外循环可以结束。

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多