运行A,然后B或运行C(Run A and then B or run C)

2019-10-19 07:17发布

我在寻找一个控制结构来处理的代码或NONE阻止可能有多个块。 最基本的情况是,只有两个条件,AB:

+-------+-------+------------+
|   A   |   B   | Blocks Run |
+-------+-------+------------+
| false | false | C          |
| false | true  | B          |
| true  | false | A          |
| true  | true  | A + B      |
+-------+-------+------------+

我迄今为止最好的事情是:

if( A )
{
    // Run Block A
}

if( B )
{
    //Run Block B
}
else if( !A )
{
    //Run Block C
}

Answer 1:

为了清楚起见,我要重命名的条件P和Q(如在约定命题逻辑 )

if( P || Q)
{
    P && A();
    Q && B();
}
else
{
    C();
}

编辑:

增加更多的检查是相当容易:

if( P || Q || R || S)
{
    P && A();
    Q && B();
    R && D();
    S && E();
}
else
{
    C();
}

编辑,评论后:

那么这个怎么样。

int runC = 1;
P && (runC=0, A());
Q && (runC=0, B());
R && (runC=0, D());
S && (runC=0, E());
runC && C();


Answer 2:

如果它是所有关于使用表减少comparsions是唯一的出路。

switch ((B << 1) | A)
{
  case 0:
    // C
    break;

  case 0b01: // case 1:
    // A
    break;

  case 0b10: // case 2:
    // B
    break;

  case 0b11: // case 3:
    // A
    // B
    break;

  default:
    // Shouldn't arrive here.
    break;
}


Answer 3:

如果你只是想一次评估每一个条件:

if (a) {
  A();
  if (b) {
    B();
  }
} else if (b) {
  B();
} else {
  C()
}

我不认为它比你的代码要好得多,虽然。 虽然它只有一次评估条件代码块来执行 ,现在复制。 据我所看到的,你要么不得不两次评估条件或编写代码块的两倍。 在这种情况下,我宁愿评估的条件,并将其保存到变量,然后用你的例子去:复制的代码块是比读一个变量两次恶化(大部分时间,它有代码,您可以了解更重要并维持,而不是试图当你还没有测量 ,这是一个瓶颈),以“优化”了。



Answer 4:

你想运行块A当条件A,其次是块B时,B条件等。 有一个例外:如果没有条件满足,则执行该NONE块。 对? 然后:

if( !A && !B && !C && ...)
{
  run NONE-BLOCK;
}
else
{
  if( A ) run A-BLOCK;
  if( B ) run B-BLOCK;
  if( C ) run C-BLOCK;
  ...
}


文章来源: Run A and then B or run C