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)
您的代码过于复杂-它不会简化,但会使代码复杂化。其他溶液(三元)根本不正确