非惰性/短路布尔运算符,强制对两个参数进行求值

Non-lazy/short-circuited bool operators, force both arguments to evaluate

本文关键字:两个 参数 短路 布尔 运算符      更新时间:2023-10-16

可能重复:
是否存在非短路逻辑“和";在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中,由于没有布尔数据类型,您可以使用按位或/和运算(也可以使用单个管道或和号(,但您需要格外小心,因为如果操作数不限于01,则无法正常工作。

尝试用逐位替换逻辑时的不当行为示例:

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;
}