【问题标题】:C program logic implementationC程序逻辑实现
【发布时间】:2011-02-16 08:45:27
【问题描述】:

我的 c 代码中有一个 if 条件。如果if 条件为真,我需要调用sleep(1) 系统调用并再次检查if 条件。最多必须这样做 9 次。如果在 9 次中的任何时间,if 条件失败,我应该从函数返回。如果 9 次到期,我应该调用另一个函数。为了更清楚,我将在下面编写伪代码。

function1()
{
  count = 0 
  label : if (condition)
  {
    count++
    sleep(1);
    if(count < = 9)
    goto label;
  }

  if(count > 9)
  {
    return;
  }

  function2(); /* if(condition) failed */
  return;
} /* End of function1() */

实现上述逻辑的最佳方法是什么。我不喜欢使用goto 语句。

【问题讨论】:

    标签: c logic implementation


    【解决方案1】:

    您已经实现了一个 for 循环。这将是完全等价的,只是即使第一个 condition 失败,计数也会为 1:

    function1()
    {
      for (count = 1; condition && count <= 9; count ++)
      {
        sleep(1);
      }
    
      if(count > 9)
      {
        return;
      }
    
      function2(); /* if(condition) failed */
      return;
    } /* End of function1() */
    

    在 C 中,您通常从零开始计数,但这只是风格问题。

    function1()
    {
      for (count = 0; condition && count < 9; count ++)
      {
        sleep(1);
      }
    
      if(count >= 9)
      {
        return;
      }
    
      function2(); /* if(condition) failed */
      return;
    } /* End of function1() */
    

    编辑

    也认为使用单个返回而不是多个返回更可取

    function1()
    {
      for (count = 0; condition && count < 9; count ++)
      {
        sleep(1);
      }
    
      if(count < 9)
      {
        function2(); /* if(condition) succeeded within 9 tries */
      }    
    } /* End of function1() */
    

    【讨论】:

    • 我们需要一个 return 在 function1 的末尾。我想你可能错过了它
    • @Linux;实际上,由于你没有指定返回类型,所以默认返回类型是int,所以你必须做return 0。但是你没有返回任何东西,所以我假设你的返回类型是void,在这种情况下你可以在函数的末尾省略它。
    【解决方案2】:

    您可以将其重新排序为

    for(count = 1; count <= 9; ++count)
    {
        if(!condition)
        {
            function2();
            break;
        }
        sleep(1);
    }
    

    【讨论】:

      【解决方案3】:

      为了让西蒙的回答满足我的需要,我正在修改他的回答。如有错误请告诉我

      function1()
      {
         for(count = 1; count <= 9; ++count)
         {
            if(!condition)
            {
                function2();
                break;
            }
            sleep(1);
         }
      
         return;
      
      } /* End of function1 */
      

      【讨论】:

      • 到目前为止看起来不错,但除非这是多线程程序的一部分,否则条件是变量不会改变。如果它的多线程条件必须是易失的并使用原子操作进行测试。您在这里所拥有的基本上是互斥锁/自旋锁的一些粗略实现。
      • @datenwolf :非常感谢。上面的实现不会进入多线程应用程序。
      • 他的意思是condition 必须是某种函数,或者至少由某种未在您的代码中说明的函数更新。
      猜你喜欢
      • 2021-07-02
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多