一連の要素のエラーをリストし、最後にブール値を返します(trueを返すとエラーが検出されなかったことを意味します)。ここでC++で関数boolを返すビット単位のAND
は、私のコードのまとめです:
bool checkStuff1() {/*...*/}
bool checkStuff2() {/*...*/}
// ...
bool checkStuffN() {/*...*/}
bool checkAllStuff()
{
bool result = true;
result &= checkStuff1();
result &= checkStuff2();
// ...
result &= checkStuffN();
return result;
}
私はresult
の値は、最後に右のいずれかになります自信を持っています。しかし、私はすべての関数checkStuffX()
が呼び出されていることを確認したいと思います(失敗したときにエラーメッセージを表示し、すべてのエラーメッセージを表示したいので)。
result = result && checkStuffX(); // Will not call checkStuffX() if result is already false
私も、私はこの方法を書いた場合、それはすべての
checkStuffX()
の関数を呼び出すことを知っている
:
は、私はこの方法を書いた場合、それは失敗最初の1の後にすべてのcheckStuffX()
をスキップすることを知っています
result = checkStuffX() && result; // Will always call checkStuffX() even if result is false
しかし、ビットごとの比較で、使用しているコードの動作が決定され、標準によって保証されているのだろうかと思いましたか?
使用されているコンパイラとその最適化によって、未定義の動作が発生する危険性がありますか?
また、 'bool failed = false;を使うこともできます。失敗しました| =!checkStuff1(); | =!checkStuff2(); ...失敗しました| =!checkStuffN(); return!failed; '。これは(A && B)=!(!A || B)の簡単な規則に従います。 –