按位与函数在 C++ 中返回 bool
Bitwise AND with function returning bool in C++
我写了一个程序,列出了一组东西的错误,最后returns一个布尔值(返回true表示没有发现错误)。
这是我的代码摘要:
bool checkStuff1() {/*...*/}
bool checkStuff2() {/*...*/}
// ...
bool checkStuffN() {/*...*/}
bool checkAllStuff()
{
bool result = true;
result &= checkStuff1();
result &= checkStuff2();
// ...
result &= checkStuffN();
return result;
}
我相信 result
的值最终会是正确的。但是,我想确保所有函数 checkStuffX()
都被调用(因为它们在失败时打印错误消息,我希望打印所有错误消息)。
我知道如果我这样写,它会在第一个失败后跳过所有 checkStuffX()
:
result = result && checkStuffX(); // Will not call checkStuffX() if result is already false
我也知道如果我这样写,它会调用所有checkStuffX()
个函数:
result = checkStuffX() && result; // Will always call checkStuffX() even if result is false
但我想知道我正在使用的代码的行为(按位比较)是否由标准确定和保证?
或者是否存在未定义行为的风险,具体取决于所使用的编译器及其优化?
这很好。
您所指的短路评估仅适用于 &&
和 ||
运算符。
虽然转换 int<->bool 可能会出现性能问题,但如果您有很多检查,它会起作用。哦,如果所有函数都具有相同的类型,你可以利用函数指针和 for 循环。
bool (*checks[])( void )= {checkStuff1, checkStuff2 ... checkStuffN};
bool result = true;
for (int i = 0; i < sizeof(checks)/sizeof(checks[0]); result = checks[i++]() && result );
如果您可以使用范围 for(),代码会看起来更简单——例如 for(auto i : checks)
。这样做的好处是,如果您在代码的其他地方声明了该过程,需要删除或添加一个步骤,您只需修改数组的声明(或者您的程序可以更改它,从而有效地改变工作流程!)。缺点 - 您不能将它用于具有不同原型的支票。
我写了一个程序,列出了一组东西的错误,最后returns一个布尔值(返回true表示没有发现错误)。
这是我的代码摘要:
bool checkStuff1() {/*...*/}
bool checkStuff2() {/*...*/}
// ...
bool checkStuffN() {/*...*/}
bool checkAllStuff()
{
bool result = true;
result &= checkStuff1();
result &= checkStuff2();
// ...
result &= checkStuffN();
return result;
}
我相信 result
的值最终会是正确的。但是,我想确保所有函数 checkStuffX()
都被调用(因为它们在失败时打印错误消息,我希望打印所有错误消息)。
我知道如果我这样写,它会在第一个失败后跳过所有 checkStuffX()
:
result = result && checkStuffX(); // Will not call checkStuffX() if result is already false
我也知道如果我这样写,它会调用所有checkStuffX()
个函数:
result = checkStuffX() && result; // Will always call checkStuffX() even if result is false
但我想知道我正在使用的代码的行为(按位比较)是否由标准确定和保证?
或者是否存在未定义行为的风险,具体取决于所使用的编译器及其优化?
这很好。
您所指的短路评估仅适用于 &&
和 ||
运算符。
虽然转换 int<->bool 可能会出现性能问题,但如果您有很多检查,它会起作用。哦,如果所有函数都具有相同的类型,你可以利用函数指针和 for 循环。
bool (*checks[])( void )= {checkStuff1, checkStuff2 ... checkStuffN};
bool result = true;
for (int i = 0; i < sizeof(checks)/sizeof(checks[0]); result = checks[i++]() && result );
如果您可以使用范围 for(),代码会看起来更简单——例如 for(auto i : checks)
。这样做的好处是,如果您在代码的其他地方声明了该过程,需要删除或添加一个步骤,您只需修改数组的声明(或者您的程序可以更改它,从而有效地改变工作流程!)。缺点 - 您不能将它用于具有不同原型的支票。