C++ 布尔逻辑,If语句缩减

C++ 布尔逻辑,If语句缩减,c++,if-statement,boolean-logic,C++,If Statement,Boolean Logic,可能是一个非常简单的问题,但我对有哪些选择感兴趣。我有三个条件,每个条件都会产生不同的输出 // special cases if(!A && B) return -1; if(A && !B) return 1; if(!A && !B) return 0; // general case return someOtherFunction(x, y); 我可以说- if(!A) { if(!B)

可能是一个非常简单的问题,但我对有哪些选择感兴趣。我有三个条件,每个条件都会产生不同的输出

// special cases
if(!A && B)
     return -1;
if(A && !B)
     return 1;
if(!A && !B)
     return 0;

// general case
return someOtherFunction(x, y);
我可以说-

if(!A) {
    if(!B)
        return 0;
     return -1;
}
if(A && !B)
    return 1;

return someOtherFunction(x, y);
我可以进一步简化吗?这是在C++中,所以我只限于使用语言特定的操作符和函数(包括STL)等< /P> 这是使用嵌套的

这是使用嵌套的。

使用查找表:

int lookup[2][2] = {
    { 0, -1}
,   { 1,  100}
};
...
bool A, B;
A = ...
B = ...
...
int res = lookup[A][B];
// When A && B, call other function
return res != 100 ? res : someOtherFunction(a, b);
注意:如果
A
B
不是布尔值,请使用双反技巧将它们转换为逻辑值:

return lookup[!!A][!!B];
使用查找表:

int lookup[2][2] = {
    { 0, -1}
,   { 1,  100}
};
...
bool A, B;
A = ...
B = ...
...
int res = lookup[A][B];
// When A && B, call other function
return res != 100 ? res : someOtherFunction(a, b);
注意:如果
A
B
不是布尔值,请使用双反技巧将它们转换为逻辑值:

return lookup[!!A][!!B];

因此,有趣的是,如果(A和B)没有定义,那么情况就是

我将使用以下解决方案,因为布尔值可以转换为整数

return A - B;
编辑:原始问题已更改。在这种情况下,我会:

if (!A or !B)
    return A - B;
return someOtherFunction(A, B);

因此,有趣的是,如果(A和B)
没有定义,那么情况就是

我将使用以下解决方案,因为布尔值可以转换为整数

return A - B;
编辑:原始问题已更改。在这种情况下,我会:

if (!A or !B)
    return A - B;
return someOtherFunction(A, B);

我建议您保持原样,以便于其他程序员(可能就是您)的可读性和理解。除非确实需要,否则不要进行不必要的优化。在这种情况下,你不会得到任何真正的优势


您可以做的一件事是将
A
B
的结果存储到变量中(如果它们是函数调用)。

为了可读性和其他程序员(可能是您)的理解,我建议您保持原样。除非确实需要,否则不要进行不必要的优化。在这种情况下,你不会得到任何真正的优势



您可以做的一件事是将
A
B
的结果存储到变量中(如果它们是函数调用)。

A和B的返回值是什么?我实际上调用了另一个函数来比较两个对象,我将编辑操作第一个比第二个简单得多。A&&B返回什么?我实际上调用了另一个函数来比较两个对象,我将编辑操作第一个比第二个简单得多。或者使用@dasblinkenlight的双重否定技巧<代码>返回(!!A)-(!!B)我很喜欢这一点,因为它相当可读,但也很优雅,我唯一的问题是,这个(隐式的比较布尔的铸造)是否是哈奇?我不是百分之百肯定的,但是看起来从布尔到int的转换在C++中是很好的定义。看到这个答案:@Madden,是的,它定义得很清楚。不过要小心。如果A和B不是变量,而是带有副作用的函数调用(从您的问题中看不明显),那么此代码将具有UB。@DmitryKuznetsov,调用
someOtherFunction(A,B)
也具有UB,如果A和B是函数,并且它们有相互干扰的副作用。或者使用@dasblinkenlight的双重否定技巧<代码>返回(!!A)-(!!B)我很喜欢这一点,因为它相当可读,但也很优雅,我唯一的问题是,这个(隐式的比较布尔的铸造)是否是哈奇?我不是百分之百肯定的,但是看起来从布尔到int的转换在C++中是很好的定义。看到这个答案:@Madden,是的,它定义得很清楚。不过要小心。如果A和B不是变量,而是带有副作用的函数调用(从您的问题中看不明显),那么此代码将具有UB。@DmitryKuznetsov,调用
someOtherFunction(A,B)
也具有UB,如果A和B是函数,并且它们有相互干扰的副作用。那么
someOtherFunction
调用呢?如果
A
为真,而
B
也为真-此表达式将无法调用其他函数。@Ajay更新了答案,以包含OP后来添加的案例。这就是OP编辑一个问题时发生的情况,没有提到它实际上是一个编辑!调用其他函数怎么样?如果
A
为真,而
B
也为真-此表达式将无法调用其他函数。@Ajay更新了答案,以包含OP后来添加的案例。这就是OP编辑一个问题时发生的情况,没有提到它实际上是一个编辑!没有人说它应该可读;-)@达斯宾莱特。您可以添加第二个带有布尔值的查找表。然后像这样编写:
return lookupool[A][B]?lookupInt[A][B]:someOtherFunction(A,B)
您的代码过于复杂-它不会简化,但会使代码复杂化。其他解决方案(三元)根本不正确。@基因可读性在读者眼中。对我来说,查找表比由三个条件组成的链更具可读性。这可能不是一个完美的例子,因为OP只有两个变量,但对于三个或更多的变量,表查找显然更优越。@Ajay不可否认,对于使用两个逻辑变量的代码,没有什么可以简化的。然而,一旦变量的数量增加到三个或更多,则
if
链的可维护性会迅速恶化到成为噩梦的程度。查找表不存在此问题。当您不需要调用
someOtherFunction
@dasblinkenlight时,它们还为您提供了一个无分支的解决方案。我完全同意。我认为你的代码很好。特别是因为我们不知道上下文,整个表达式将在最后使用。此外,如果此代码在许多地方以不同的方式重复,则减少代码行数非常有用。没有人说它应该可读;-)@达斯宾莱特。您可以添加第二个带有布尔值的查找表。然后像这样编写:
return lookupool[A][B]?lookupInt[A][B]:someOtherFunction(A,B)
您的代码过于复杂-它不会简化,但会使代码复杂化。其他溶液(三元)根本不正确