代码之家  ›  专栏  ›  技术社区  ›  Hernán Eche Shankar ARUL

“while(0);”是否始终等于“break;while(1);”?

  •  4
  • Hernán Eche Shankar ARUL  · 技术社区  · 15 年前

    我比较了gcc汇编程序的输出

    do{ 
    
    //some code 
    
    }while(0);
    

    具有

    do{
    
    //some code
    
     break; 
    }while(1);
    

    输出相等,有或无优化,但..

    总是那样?

    没有实验能证明理论,只能证明它们是错误的。

    6 回复  |  直到 9 年前
        1
  •  18
  •   Gianni    15 年前

    有一点不同:

    do {
      // code
      if ( condition )
        continue;
      // code
      break;
    } while(1);
    

    将在以下情况下重新启动循环 condition 是真的,而在 } while(0); 版本 continue 相当于 break .

    如果没有 持续 如果存在,那么它们应该生成完全相同的代码。

        2
  •  5
  •   Sean    15 年前

    这些形式是不等价的。这是一个无限循环:

    do {
        continue;
        break;
    } while (1);
    

    这不是:

    do {
        continue;
    } while (0);
    
        3
  •  4
  •   David Sykes    15 年前

    编辑: 在阅读了关于这个问题的各种评论后,我承认这个答案是错误的。对不起的。

    而不是:

    do{ 
    
    //some code 
    
    }while(0);
    

    或:

    do{
    
    //some code
    
     break; 
    }while(1);
    

    我只会使用:

    //some code
    

    如果你能在C++中做到这一点,我还不确定100%,但是如果你想限制变量的范围,这就是为什么你要这么做,只需使用大括号:

    {
    
     // Some Code
    
    }
    
        4
  •  4
  •   Aoi Karasu    15 年前

    马库斯的评论让我想到了这个答案:区别在于使用 continue 关键字。

    在这种情况下:

    int _tmain(int argc, _TCHAR* argv[])
    {
        int i = 0;
        do {
            ++i;
            _tprintf(_T("Iteration %d\n"), i);
            if (i < 30) continue;
        } while(0);
    
        return 0;
    }
    

    你得到 只有一个 迭代,而在这种情况下:

    int _tmain(int argc, _TCHAR* argv[])
    {
        int i = 0;
        do {
            ++i;
            _tprintf(_T("Iteration %d\n"), i);
            if (i < 30) continue;
            break;
        } while(1);
    
        return 0;
    }
    

    你得到 三十 迭代。根据VS2008进行测试。

        5
  •  3
  •   kgiannakakis    15 年前

    do-while子句在逻辑上是等价的。如果它们被翻译成相同的字节码,则取决于手头的编译器。我想大多数现代编译器都会平等对待它们。

        6
  •  0
  •   John Dibling    15 年前

    根据您的评论编辑 break 以便在满足某些条件时能够脱离“循环”。

    如果这是你想要完成的:

    do
    { 
      // processing step 1
      if( some_condition )
        break;
      // processing step 2
      if( some_condition )
        break;
      // etcetera..
    } while(0)
    

    …然后将while循环中的代码分解为具有多个返回的独立函数:

    void processing()
    {
    
      // processing step 1
      if( some_condition )
        return;
      // processing step 2
      if( some_condition )
        return;
      // etcetera..
    }
    
    int main()
    {
      // ...
      processing();
      return 0;
    }