非惰性/短路布尔运算符,强制对两个参数进行求值
Non-lazy/short-circuited bool operators, force both arguments to evaluate
可能重复:
是否存在非短路逻辑“和";在C++中?
我正在寻找一种简单的方法来强制布尔表达式(||
&&
(的右侧进行求值。如果左侧已经可以确定结果,则通常不会评估右侧。
通常我会返回到以下语法:
c = expr();
r = r || c;
因为以下内容不能保证expr()
将被评估:
r = r || expr();
有没有一个更短/更简单的语法来代替我现在所做的?还是我已经有了最紧凑的形式?
标记为C和C++,因为解决方案可能是共享的。我实际上是在C++中编码的
有很多方法可以做到这一点,首先只需评估两个选项并将结果存储为bools:
const bool a = expr();
const bool b = r;
return a || b;
或者你可以使用这样的函数:
bool or(bool param1, bool param2)
{
return param1 || param2;
}
并且使用该函数将强制在调用之前对这两个参数进行评估。
通常大多数人都喜欢布尔运算符的短路评估。
在Java中,单个管道或与号可以用于boolean
类型的非短路求值,但在C中,由于没有布尔数据类型,您可以使用按位或/和运算(也可以使用单个管道或和号(,但您需要格外小心,因为如果操作数不限于0
和1
,则无法正常工作。
尝试用逐位替换逻辑时的不当行为示例:
2 && 1 == 1
2 & 1 == 0
一个可能适用于您的解决方案是使用一些宏,并利用中性或可逆逻辑运算来强制执行"布尔"类型转换,然后使用逐位运算:
#define OR(A, B) (!!(A) | !!(B))
#define AND(A, B) (!!(A) & !!(B))
关于C++我真的不知道细节,但我想情况和C中的一样…也许你可以做一些运算符重载黑魔法严重的大便xD。
不,你正在尽最大努力做什么。
使用|或&操作员?适用于普通场景的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 onern";
if(A() | B())
std::cout<<"Passed tworn";
return 0;
}
相关文章:
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- C++如何在 switch 语句中放置两个参数
- 为什么我不能用两个参数重载 C++ 运算符 []?
- C++添加检查以避免读取两个参数
- 宏的定义从一个值创建两个参数
- C++ 如何使用一个参数从派生类构造函数中调用具有两个参数的超类构造函数
- 通过将两个参数包的元素线程化为类型对来解压缩这两个参数包
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- 错误:函数调用中有两个参数
- Qt 线程两个参数
- 为什么lambda函数用于stl函数,例如sort(),c 中的max_element()函数以两个参数为输入
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 具有两个参数的 Decltype 修改类型
- 将两个参数传递到谓词remove_if
- 同时扩展两个参数包
- 用两个参数调用新操作员,但没有分配
- 在Variadic模板中交换两个参数
- C CPPUNIT_ASSERT具有两个参数
- 具有两个参数的乘法函数
- 使用一个可选参数获取两个参数到main