在C语言中,如何从循环外部中断?

z2acfund  于 2023-01-12  发布在  其他
关注(0)|答案(3)|浏览(191)

我有一个代码:

void core()
{
   loop
   {
   first_process();
   secound_process();
   
   process_synchronizer();
   }
some_other_job();
}

在进程suynchronizer()中,我评估同步,如果不满足条件,它将中断循环,问题是break不允许在该函数中使用,因为它不在循环中。

void process_synchronizer()
{
   if(criterion)
      do something;
   else
      break;
}

但是c编译器不允许使用breakbreak statement not within loop or switch

kxe2p93d

kxe2p93d1#

像这样:

void core()
{
   bool exit_flag = false
   while (!exit_flag)
   {
       first_process(&exit_flag);
       if (!exit_flag)
           secound_process(&exit_flag);
       if (!exit_flag)
           process_synchronizer(&exit_flag);
   }
}

或者这个:

void core()
{
   bool exit_flag = false
   while (!exit_flag)
   {
       exit_flag = first_process();
       if (!exit_flag)
           exit_flag = secound_process();
       if (!exit_flag)
           exit_flag = process_synchronizer();
   }
}

然后调整你的函数以返回合适的值,如下所示:

bool process_synchronizer()
{
   if(criterion)
      do something;
      return false;
   else
      return true;
}
h43kikqp

h43kikqp2#

或许:

bool process_synchronizer()
{
   if(!criterion) {
      return false;
   }
   some code here...
   return true;    /* No need of an else here */
}

那就这么叫吧:

void core()
{
   bool condition = true;

   do {
   first_process();
   secound_process();
   
   condition = process_synchronizer();
   } while (condition);

   some_other_job();
}

或者像这样:

void core()
{
   while (true) {
       first_process();
       secound_process();
   
       if (!process_synchronizer()) {
           break;
   } 
   some_other_job();
}

或者更短,就像@David在评论中提到的:

void core()
{
   do {
       first_process();
       secound_process();
   } while (process_synchronizer());

   some_other_job();
}
vzgqcmou

vzgqcmou3#

假设您的两个“process”函数和“synch”函数都希望返回go/no-go状态,那么您不需要太多代码:

bool synchronizer() {
    bool criterion = /* to be defined */;
    return criterion;
}

void core() {
    while( proc0() && proc1() && synchronizer() )
        ; // happy

    some_other_job();
}

远离void函数可能是个好主意(编写这些函数是为了执行某些功能,但无法将其成功/失败传达给调用者)。

相关问题