是否可以在C++中进入更高级别的范围条件?



我在两个do something部分都有完全相同的代码行,所以我想将这两个部分合并为一个。但我不想为do something创建单独的函数。

当它到达condition B的else时,有办法去condition A的else吗?

if (conditionA)
{
//some code here
if (conditionB)
{
}
else
{
//do something
}
}
else
{
//do something
}

跳过代码是绝对不鼓励的,如果你真的想最小化代码,那么你唯一能做的就是重新安排流程以更好地满足你的需求,例如:

if (conditionA)
{
some code 
if (conditionB)
do something else
}
if (!conditionA || !conditionB)
do something

如果您(如注释中所示(不想创建一个需要传递6个参数的函数,那么您可以使用如下lambda:

const auto do_something = [&] { /* do stuff with captured reference variables */ };
if (conditionA) {
// some code here
if (conditionB) {
// stuff
} else {
do_something();
}
} else {
do_something();
}

if-else实际上只是gotos的语法糖。您可以在此处使用显式goto

if (conditionA)
{
//some code here
if (conditionB)
{
} 
else goto do_something;
}
else
{
do_something: /*...*/;
}

这可能/应该比添加另一个if检查更快。

或者,也可以使用可内联的static函数。如果它真的内联了,应该不会有性能差异(而且它不会激怒被认为是有害教条主义者的gotos(。

(在我看来,偶尔的、干净的、向下的goto不会损害代码的可读性,但反对goto的教条主义是强烈的(正如对这个答案的反对票所证明的那样:D((。

假设//do something之后没有代码,则可以使用等模式

if (conditionA)
{
//some code here
if (conditionB)
{
//do something else
return;
}
}
//do something

然而,更清晰的模式是将//do something封装到一个单独的函数中。

回答标题中的问题:是的,这是可能的。我至少能想到三种方法:

  1. 使用goto
  2. 在函数中放入"做某事"代码(可能是为了性能而内联的((可能会产生更干净的代码(
  3. 如其他答案所示,重新格式化if/else语句并合并条件。其原理是对出现两次的代码段进行分组(通过使用运算符统一逻辑表达式((如果代码不是那么大,或者与其他部分有很高的依赖性,我更喜欢这种方式(

我会更改条件并稍微重新排列代码。

if (!conditionA || (conditionA && !conditionB))
do_something();
else if (conditionA) {
some_code_here();
if (conditionB)
// Your `if(conditionB)` section goes here.
}

另一种可能性(我认为通常更可取(是将条件组合成一个变量,然后对组合使用case语句:

unsigned cond = ConditionA | (ConditionB << 1);
enum { neither, A, B, both};
switch (cond) { 
neither: // Both A and B were false;
A: // Only A was true;
B: // Only B was true;
both: // both A and B were true;
}

然后,当您希望在两个条件下执行相同的代码时,只需让正常的切换失败即可。

您可以将其封装到cthulhu循环中并使用break:

for(;;) // executed only once
{
if (conditionA)
{
//some code here
if(conditionB)
{
//  some more code here
break; // for(;;)
}
}
//do something
break; // for(;;)
}

我认为这比使用for(;;)(VTT答案,我向上推(更容易

do 
{
if(conditionA )
{ 
//some code here
if(conditionB) 
{ 
//some code
break;
}  
} 
// do something
} while(0);

最新更新