我正在寻找一种简单的方法来强制布尔表达式(||
&&
)的右侧进行评估。通常情况下,如果左侧已经确定结果,则不评估右侧。
通常我会恢复这种语法:
c = expr();
r = r || c;
因为以下内容不能保证评估expr()
:
r = r || expr();
是否有更短/更简单的语法来替换我现在正在做的事情?或者我已经拥有最紧凑的形式?
标记为C和C ++,因为可能会共享解决方案。我实际上是用C ++编写的
答案 0 :(得分:2)
有很多方法可以做到这一点,首先只评估两个选项并将结果存储为bools:
const bool a = expr();
const bool b = r;
return a || b;
或者你可以使用这样的函数:
bool or(bool param1, bool param2)
{
return param1 || param2;
}
并且使用该函数将强制在调用它们之前评估这两个参数。
通常大多数人都喜欢布尔运算符的短路评估。
答案 1 :(得分:1)
在Java中,单个管道或&符号将用于boolean
类型的非短路评估,但在C中,因为您没有布尔数据类型,您可以使用按位或/和操作(a单管或者&符号),但是你需要格外小心,因为如果操作数不限于0
和1
,那将无法正常工作。
尝试使用按位替换逻辑时的错误行为示例:
2 && 1 == 1
2 & 1 == 0
可能对您有用的解决方案是使用一些宏并利用中性或可逆逻辑操作来强制执行“布尔”类型转换,然后使用按位运算:
#define OR(A, B) (!!(A) | !!(B))
#define AND(A, B) (!!(A) & !!(B))
关于C ++我真的不知道细节,但我猜情况与C中的相同......也许你可以做一些运算符重载黑魔法严重的狗屎xD。
答案 2 :(得分:0)
不,你正在做的最好的事情。
答案 3 :(得分:0)
如何使用|或者;运营商?在VC ++中适用于常见场景。
#include <iostream>
bool A()
{
std::cout<<"A";
return true;
}
bool B()
{
std::cout<<"B";
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
if(!(B() & A()))
std::cout<<"Passed one\r\n";
if(A() | B())
std::cout<<"Passed two\r\n";
return 0;
}