【问题标题】:do while loop condition in c在c中做while循环条件
【发布时间】:2012-02-14 11:04:30
【问题描述】:

下面的两个代码片段是否完全相同?

do
{
    Delay_us(1);
    status = fetchStatus();
}while(!status);

第二个片段->

do
{
    Delay_us(1);
}while(status = fetchStatus(), !status);

哪个更好?

【问题讨论】:

  • 第二个太可怕了。第一个的替代方案实际上是while (!(status = fetchStatus())
  • 第二个合法吗?循环的条件不需要是有效的表达式吗?这甚至会评估到什么?
  • @prelic:(据我所知)这是一个晦涩难懂的功能,使用时会引起混淆:en.wikipedia.org/wiki/Comma_operator
  • @prelic:有效。逗号分隔的表达式按从左到右的顺序计算,并具有最右边表达式的值。
  • @BhaskarUpadhyayula:它们在各方面都是等价的,即使在存在多线程和可重入的情况下;逗号运算符引入了一个序列点。

标签: c while-loop conditional-statements pic


【解决方案1】:

怎么样:

for(; !fetchStatus(); Delay_us(1));

【讨论】:

    【解决方案2】:

    是的,他们也这样做,但我更喜欢以下内容:

    do {
        Delay_us(1);
    } while (!(status = fetchStatus()));
    

    因为它将所有内容简化为一个语句,而不是两个。

    【讨论】:

    • 嗯?这不会减少调用次数。
    • @StephenCanon 对不起,它减少了语句的数量,感谢您指出这一点。
    【解决方案3】:

    它们是等价的。由于它们是等效的,因此两者都不是首选。然而,有些人可能更喜欢第一个更美观,因为它更熟悉。

    您真的打算在第一次检查状态之前延迟吗?

    【讨论】:

      【解决方案4】:

      我绝不是专家,但我相信我们正在进入编译器优化领域。这实际上取决于您使用哪个编译器从该代码生成二进制文件。一个编译器可能会采用类似于您的第一个 sn-p 的代码并将其优化为有效执行您的第二个 sn-p 所做的二进制代码。

      【讨论】:

        【解决方案5】:

        它们具有相同的逻辑输出。在每种情况下,状态都被分配然后评估,但第一个更具可读性。一般不要使用逗号运算符。

        【讨论】:

          【解决方案6】:

          你可以这样做:

          do
          {
              Delay_us(1);
          } while( !fetchStatus() );
          

          这样,如果您使用局部变量,则无需创建它。

          【讨论】:

          • 你怎么知道他不用呢?
          • @asaelr 我不知道 OP 没有使用它,我只是从 OP 中收集信息。
          • @Christian 那么我建议使用this answer,它可能更适合您的需要。
          • @Neal +1 因为我喜欢你链接的那个答案:)
          • @Christian 没问题,这就是我们来这里的目的,为您提供帮助!
          猜你喜欢
          • 1970-01-01
          • 2015-01-01
          • 2013-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-21
          相关资源
          最近更新 更多