什么时候会...有一个条件的while(false)块有意义吗?

时间:2013-12-06 05:30:24

标签: c

在处理大型现有源代码库时,我发现了这个构造的几个实例:

do
{
    if (!a)
        break;
    something();
} while(false);

在什么情况下比(在我看来)更简单

更好
if (a)
{
    something();
}

这个构造有很多实例,所以我认为它是故意的。不幸的是,编写该代码的人不可用。

有没有理由为什么第一种编写代码块的方法更适合第二种呢?

3 个答案:

答案 0 :(得分:5)

这是一种在没有明确使用它的情况下实现GOTO的方法。

一般来说,我相信C会发出if语句,以便您可以使用structured programming范例进行编程。

维基百科的文章指出,偏离范式将是提前退出,这将是do while (false)的用例。但是,处理early exit的建议伪代码在false循环中仍然存在一个不总是 - while的条件。

对于处理有错误的文件的例子,它注意到某人可能会这样写:

// open file
while (/* reading not finished */)
{
    // read some data;
    if (/* error */)
    {
        // stop the subprogram and inform rest of the program about the error;
        // use of break here would skip the "process read data" step
    }
    // process read data;
}
// finish the subprogram;

答案 1 :(得分:1)

如果有多个休息条件&如果不能使用开关那么一般程序员使用do而

do
{
   if (some  cond)
   {
     // do some job
      break;
   }
   else if (some cond)
   {
      // do some thing break
   }

   // similarly
}
while(false);

目标是在执行do表达式中的一个或几个条件后跳出循环

答案 2 :(得分:1)

这种策略的一个类似的比喻是从一个函数返回;如果这个代码在一个函数中,那么“break”将是一个“return false”;但是,这在这里是不可能的,因为人们不能简单地在C / C ++中突破任意代码范围。

执行“中断”技巧可防止无意义的if-nesting越来越多的健全性检查和失败条件的建立。是的,总有更多的方法可以做,但这种策略通常反映了正常的思维过程和功能的工作流程,人们通常对这个工作流程非常熟悉。

甚至可能是一个函数被移动到另一个代码区域(也许是因为它是如此专业以至于它永远不会被重用),并且它不值得努力重构“返回”驱动的逻辑。

例如,这可能是一个更有意义的战略演示。我已经包含了一个不那么简单的设置来演示为什么你会看到这个:

intenseStructure = allocate_memory_and_other_expensive_things();
do {
    if( ! some_test_of( variable1 ) ) {
        some_log( "Unexpected value for variable1." );
        break;
    }

    variable2 = some_thing_involving( variable1 );
    if( ! some_test_of( variable2 ) ) {
        some_log( "Unexpected value for variable2." );
        break;
    }

    something();
} while(false);
delete intenseStructure;

在这里,我们假设在设置“intenseStructure”之前我们无法有意义地测试“variable1”,而“variable2”(需要“variable1”)也是如此。 “do ... while(false)”策略反映了基于功能的方法:

bool do_something( Intense* intenseStructure ) {
    if( ! some_test_of( variable1 ) ) {
        some_log( "Unexpected value for variable1." );
        return false;
    }

    variable2 = some_thing_involving( variable1 );
    if( ! some_test_of( variable2 ) ) {
        some_log( "Unexpected value for variable2." );
        return false;
    }

    something();
    return true;
}

intenseStructure = allocate_memory_and_other_expensive_things();
do_something( intenseStructure );
delete intenseStructure;

这是一个更“传统”的if-oriented方式的例子。正如你所看到的,它有点混乱,同时表现得相当。 if语句的嵌套在一段时间后会变得非常麻烦和混乱,代码维护会变得非常困难:

intenseStructure = allocate_memory_and_other_expensive_things();
if( ! some_test_of( variable1 ) ) {
    some_log( "Unexpected value for variable1." );
} else {
    variable2 = some_thing_involving( variable1 );
    if( ! some_test_of( variable2 ) ) {
        some_log( "Unexpected value for variable2." );
    } else {
        something();
    }
}
delete intenseStructure;