C 当一个do…while(false)块带有一个条件时,什么时候才有意义?
在处理大型现有源代码库时,我发现了此构造的几个实例:C 当一个do…while(false)块带有一个条件时,什么时候才有意义?,c,C,在处理大型现有源代码库时,我发现了此构造的几个实例: do { if (!a) break; something(); } while(false); 在什么情况下,这比(在我看来)更简单 ? 这个构造有很多实例,所以我假设它是有意的。不幸的是,编写代码的人不可用 为什么第一种编写代码块的方法比第二种更可取?这是一种实现GOTO而不显式使用它的方法 一般来说,我相信C将if语句放在一个范例中编程 维基百科的那篇文章指出,与范式的一个偏差是提前退出,这将是do w
do
{
if (!a)
break;
something();
} while(false);
在什么情况下,这比(在我看来)更简单
?
这个构造有很多实例,所以我假设它是有意的。不幸的是,编写代码的人不可用
为什么第一种编写代码块的方法比第二种更可取?这是一种实现
GOTO
而不显式使用它的方法
一般来说,我相信C将if
语句放在一个范例中编程
维基百科的那篇文章指出,与范式的一个偏差是提前退出,这将是do while(false)
的一个用例。但是,建议处理的伪代码在while
循环中仍然存在一个不总是-false
的条件
对于处理带有错误的文件的示例,它注意到有人可能会这样编写:
// 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;
这是一种实现
GOTO
而无需显式使用的方法
一般来说,我相信C将if
语句放在一个范例中编程
维基百科的那篇文章指出,与范式的一个偏差是提前退出,这将是do while(false)
的一个用例。但是,建议处理的伪代码在while
循环中仍然存在一个不总是-false
的条件
对于处理带有错误的文件的示例,它注意到有人可能会这样编写:
// 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;
如果存在多个中断条件&如果无法使用开关,则程序员通常使用do while
do
{
if (some cond)
{
// do some job
break;
}
else if (some cond)
{
// do some thing break
}
// similarly
}
while(false);
目标是在执行do表达式中的一个或几个条件后跳出循环如果存在多个中断条件&如果无法使用开关,则程序员通常使用do while
do
{
if (some cond)
{
// do some job
break;
}
else if (some cond)
{
// do some thing break
}
// similarly
}
while(false);
目标是在执行do表达式中的一个或几个条件后跳出循环此策略的一个恰当类比是从函数返回;如果此代码在函数中,则“break”将是“returnfalse”;然而,这在这里是不可能的,因为在C/C++中不能简单地突破任意代码范围 随着越来越多的健全性检查和故障条件的建立,使用“中断”技巧可以防止无意义的if嵌套。是的,做事总是有更多的方法,但这种策略通常反映了正常的思维过程和功能工作流程,人们通常非常熟悉这种工作流程 甚至可能函数被移动到另一个代码区域(可能是因为它太过专业化,永远不会被重用),重构“返回”驱动的逻辑是不值得的 例如,这可能是一个更有意义的战略演示。我已经包括了一个不那么琐碎的设置来演示为什么您可能会看到这一点:
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;
在这里,让我们假设在我们建立“强度结构”之前,我们无法有意义地测试“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导向方式的示例。如您所见,它的行为相当,但有点混乱。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;
这一策略的一个恰当类比是从函数返回;如果此代码在函数中,则“break”将是“returnfalse”;然而,这在这里是不可能的,因为在C/C++中不能简单地突破任意代码范围 随着越来越多的健全性检查和故障条件的建立,使用“中断”技巧可以防止无意义的if嵌套。是的,做事总是有更多的方法,但这种策略通常反映了正常的思维过程和功能工作流程,人们通常非常熟悉这种工作流程 甚至可能函数被移动到另一个代码区域(可能是因为它太过专业化,永远不会被重用),重构“返回”驱动的逻辑是不值得的 例如,这可能是一个更有意义的战略演示。我已经包括了一个不那么琐碎的设置来演示为什么您可能会看到这一点:
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;
在这里,让我们假设在我们建立“强度结构”之前,我们无法有意义地测试“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导向方式的示例。如您所见,它的行为相当,但有点混乱。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;
什么时候这比编写正常的
if
,或者实际编写goto
更可取呢?在C中,我看到了goto
的一个很好的用法,就是。我自己更像一个C++的人(我们将使用例外和RAII来做上述例子),所以我知道没有其他地方我想使用<代码> Goto ,因此,我不能想出任何原因,为什么<代码> do{/**/},而(false)是我想使用的。这绝对是我找到的最好的用例,用于<代码> Goto < /C>虽然我也看到它在手写解析器中得到了有效的使用。什么时候比编写普通的if
,或者如果你想这样做,那么实际编写goto
,更好呢?在C中,我看到了goto
的一个很好的用法,就是。我自己更是一个C++的人(我们将使用例外和RAII为上面的例子),所以我知道没有其他地方我想使用<代码> Goto < /C>