2016-11-24 1 views
8

一連の要素のエラーをリストし、最後にブール値を返します(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 

しかし、ビットごとの比較で、使用しているコードの動作が決定され、標準によって保証されているのだろうかと思いましたか?

使用されているコンパイラとその最適化によって、未定義の動作が発生する危険性がありますか?

+1

また、 'bool failed = false;を使うこともできます。失敗しました| =!checkStuff1(); | =!checkStuff2(); ...失敗しました| =!checkStuffN(); return!failed; '。これは(A && B)=!(!A || B)の簡単な規則に従います。 –

答えて

9

これは完全に問題ありません。

あなたが参照している短絡評価は、&&||オペレータにのみ適用されます。

+0

関連:http://stackoverflow.com/questions/2488406/why-doesnt-c-have-or-for-booleans –

+0

そこにありますか?いずれにしても短絡評価(または同様の最適化)がないことを保証するものです。 X == 0のX&= Yは、Yの値が何であれX == 0で終わることになります。どのコンパイラが使用されていても、その動作はどこでも同じですが、それが関数であればY()が呼び出されます。 標準に保証するものはありますか? – teupoui

+0

はい、ブール代数の定義によって保証されています。 1つのオペランドのすべてのビットが0の場合、ビット演算子の結果は0になることが保証されます。 –

0

多くの点検があれば変換の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(auto i : checks)のように。コードのどこか他の場所に宣言したプロシージャを削除したり追加したりする必要がある場合は、配列の宣言を変更するだけで済みます(またはプログラムによってワークフローが効果的に変更される可能性があります)。欠点 - プロトタイプの異なる小切手では使用できません。

+0

それは私の場合にはあまり助けにならないでしょう...私は質問を単純化しました。チェック関数は毎回異なるパラメータをとります。とにかくありがとう ! – teupoui

関連する問題