1

我正在寻找一种控制结构来处理可能的多个代码块或一个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
}
4

4 回答 4

4

如果这一切都是关于使用表格最小化比较是唯一的方法。

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;
}
于 2014-02-07T12:38:23.367 回答
3

为清楚起见,我将重命名您的条件 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();
于 2014-02-07T12:27:43.030 回答
1

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

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

不过,我认为它并不比您的代码好多少。虽然它只评估条件一次,但现在要执行的代码块是重复的。据我所知,您要么必须对条件进行两次评估,要么两次编写代码块。在这种情况下,我更喜欢评估条件并将它们保存到变量中,然后以您的示例为例:复制代码块比读取变量两次更糟糕(大多数情况下,拥有可以理解的代码更重要并保持而不是在您没有测量到它是瓶颈时尝试“优化”它)。

于 2014-02-07T12:33:04.950 回答
0

您想在条件 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;
  ...
}
于 2014-02-07T12:40:22.433 回答