我在寻找一个控制结构来处理的代码或NONE阻止可能有多个块。 最基本的情况是,只有两个条件,A和B:
+-------+-------+------------+
| 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
}
为了清楚起见,我要重命名的条件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();
如果它是所有关于使用表减少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;
}
如果你只是想一次评估每一个条件:
if (a) {
A();
if (b) {
B();
}
} else if (b) {
B();
} else {
C()
}
我不认为它比你的代码要好得多,虽然。 虽然它只有一次评估条件 , 代码块来执行 ,现在复制。 据我所看到的,你要么不得不两次评估条件或编写代码块的两倍。 在这种情况下,我宁愿评估的条件,并将其保存到变量,然后用你的例子去:复制的代码块是比读一个变量两次恶化(大部分时间,它有代码,您可以了解更重要并维持,而不是试图当你还没有测量 ,这是一个瓶颈),以“优化”了。
你想运行块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;
...
}