【问题标题】:getting out of a loop in C摆脱 C 中的循环
【发布时间】:2016-04-10 03:20:03
【问题描述】:

我正在尝试使用 C 退出 while loop,但使用中断、返回或更改 while 条件不起作用。

基本上,我想知道为什么在最后一个else if 中,当我声明back = true 时,我的代码一直输入for

我希望输出如下:enter1, enter1, enter1, enter1, enter2

相反,输出类似于enter1, enter1, enter1, enter2, enter2, enter2, enter1, enter1, enter1....

这是我的代码工作:

void SolveMap8(Core* core_building, Building* new, Stack* solve, bool goingBack){
  Core* coreBuilding = core_building;
  Building* first = new -> linked[0];
  Building* next  = NULL;
  bool back = goingBack;
  while (back == false) {
    for (int i = 0; i < (first -> zone -> building_count); i++) {
      if (first ->  zone -> buildings[i] != NULL) {
        if (first != first ->  zone -> buildings[i]) {
          next  = first ->  zone -> buildings[i];
          if(next -> color == coreBuilding -> buildings[0] -> color && !city_client_is_taken(next)) {
            puts("enter0");
            Building_Pair* newPair = Building_Tuple_Create(first, next);
            stack_push(solve, newPair);
            city_client_link(first, next);
            break;
          }
          else if(!city_client_is_taken(next)) {
            if (city_client_is_blank(next)) {
              if (!(next -> cored)) {
                puts("enter1");
                Building_Pair* newPair = Building_Tuple_Create(first, next);
                stack_push(solve, newPair);
                city_client_link(first, next);
                SolveMap8(coreBuilding, next, solve, false);
              }
            }
          }
          else if (city_client_is_taken(next)) {
            if (i == first -> zone -> building_count - 1) {
                puts("enter2");
                back = true;
            }
          }
        }
      }
    }
  }
}

【问题讨论】:

  • 测试back == false 将在您的for 循环终止之前完成。也许在你的if(city_client_is_taken(next)) 分支中,你想说back = true 然后break;
  • 设置 back = true 之前的 if (i == first -&gt; zone -&gt; building_count - 1) 条件意味着这只会发生在 for 循环的最后一次迭代中,因此不需要 break
  • 尝试在for循环的每次迭代中打印i的值,并在循环之前打印first-&gt;zone-&gt;building_count的值。这应该让您更好地了解正在发生的事情。
  • SolveMap8 是否有可能被多次调用?
  • 请注意,箭头-&gt; 和点. 运算符绑定得非常紧密,不应该用空格与其操作数分开。也就是说,您的行 if(next -&gt; color == coreBuilding -&gt; buildings[0] -&gt; color &amp;&amp; !city_client_is_taken(next)) 应该是 if (next-&gt;color == coreBuilding-&gt;buildings[0]-&gt;color &amp;&amp; !city_client_is_taken(next)) (也请注意关键字后面的空格)。

标签: c for-loop while-loop


【解决方案1】:

更新抱歉,错过了递归。在这种情况下,您的问题与缺少 break 语句无关,而是您试图在与当前所处范围不同的范围内逃离 for 循环。您将需要特殊逻辑来处理全局“完成”条件。也许是这样的:

void process(Core* core, bool& done) {
    for (int i = 0; i < core->size() && !done; ++i) {
        if (!core[i]->is_taken()) {
            process(core[i], done);
        } else if (core[i]->is_taken() {
            // done procesing
            done = true;
        }
    }
}

// use via
bool done = false;
process(myCore, done);

在您拥有的版本中,goingBack 标志是按值传递的,因此每个函数都有自己的副本,并且无法在递归调用链中将值传递回父级。在我上面的代码中,done 作为引用传递,因此在递归链中的某个点更改值将使其在父范围内可见(因为变量的范围在函数本身之外)。希望这对您更有帮助。

【讨论】:

  • 看起来这不是问题,因为该代码仅在 for 循环的最终迭代中执行。在这种情况下,添加 break 并不重要。
  • 我只是在最后的back = true之后添加一个break;,输出仍然类似于enter1, enter1, enter1, enter2, enter2, enter2, enter1, enter2, enter1
  • 注意有递归,所以不一定是代码的最后一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多