在处理大型现有源代码库时,我发现了这个构造的几个实例:
do
{
if (!a)
break;
something();
} while(false);
在什么情况下比(在我看来)更简单
更好if (a)
{
something();
}
这个构造有很多实例,所以我认为它是故意的。不幸的是,编写该代码的人不可用。
有没有理由为什么第一种编写代码块的方法更适合第二种呢?
答案 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;