2016-11-24 1 views
8

Ich habe ein Programm geschrieben, das Fehler in einer Menge von Sachen auflistet und einen booleschen Wert am Ende zurückgibt (das Zurückgeben von wahr bedeutet, dass kein Fehler gefunden wurde). HierBitweises UND mit Funktion, die bool in C++ zurückgibt

ist eine Zusammenfassung meines Code:

bool checkStuff1() {/*...*/} 
bool checkStuff2() {/*...*/} 
// ... 
bool checkStuffN() {/*...*/} 

bool checkAllStuff() 
{ 
    bool result = true; 
    result &= checkStuff1(); 
    result &= checkStuff2(); 
    // ... 
    result &= checkStuffN(); 
    return result; 
} 

Ich habe Vertrauen der Wert result wird die richtige am Ende sein. Ich möchte jedoch sicher sein, dass alle Funktionen checkStuffX() aufgerufen werden (weil sie beim Fehlschlagen Fehlermeldungen ausgeben und ich möchte, dass alle Fehlermeldungen gedruckt werden).

Ich weiß, dass wenn ich diese Art und Weise geschrieben, es wäre alles checkStuffX() nach dem ersten Sprung versagt:

result = result && checkStuffX(); // Will not call checkStuffX() if result is already false 

Ich weiß auch, dass, wenn ich auf diese Weise geschrieben, werden alle checkStuffX() Funktionen aufrufen:

Aber ich fragte mich, ob das Verhalten des Codes, den ich benutze, mit bitweisem Vergleich vom Standard bestimmt und garantiert wurde?

Oder besteht die Gefahr von undefiniertem Verhalten, abhängig vom verwendeten Compiler und dessen Optimierungen?

+1

Sie können auch 'bool failed = false; fehlgeschlagen | =! checkStuff1(); fehlgeschlagen | =! checkStuff2(); ... fehlgeschlagen | =! checkStuffN(); return! failed; '. Dies folgt der einfachen Regel von (A && B) =! (! A ||! B) –

Antwort

9

Das ist völlig in Ordnung.

Die Kurzschlussauswertung, auf die Sie sich beziehen, gilt nur für die Operatoren && und ||.

+0

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

+0

Gibt es etwas, was garantiert, dass es keine Kurzschlussauswertung (oder ähnliche Optimierung) auf jeden Fall mit dem Operator & = geben wird? Ich meine, X & = Y mit X == 0 endet immer mit X == 0 was auch immer der Wert von Y ist. Ich möchte sicher sein, dass, egal welcher Compiler verwendet wird, das Verhalten überall gleich ist, und Y() wird aufgerufen, wenn es eine Funktion ist. Gibt es etwas in den Standards, das es garantiert? – teupoui

+0

Ja, es ist garantiert durch die Definition der booleschen Algebra. Wenn alle Bits in einem Operanden 0 sind, ist das Ergebnis des bitweisen "&" Operators garantiert 0. –

0

Es würde funktionieren, obwohl Konvertierung int < -> bool vielleicht Leistungsproblem, wenn Sie viele Prüfungen haben. Oh, Sie können Funktionszeiger und for-Schleife nutzen, wenn alle Funktionen denselben Typ haben.

bool (*checks[])(void)= {checkStuff1, checkStuff2 ... checkStuffN}; 

bool result = true; 
for (int i = 0; i < sizeof(checks)/sizeof(checks[0]); result = checks[i++]() && result); 

-Code wäre einfacher aussehen, wenn Sie für Fern verwenden() - wie for(auto i : checks). Vorteil, wenn Sie diese Prozedur irgendwo anders im Code deklariert haben, müssen Sie einen Schritt entfernen oder hinzufügen, Sie ändern einfach die Deklaration des Arrays (oder Ihr Programm kann sie ändern, was den Workflow effektiv verändert!). Nachteil - Sie können es nicht mit Schecks verwenden, die verschiedene Prototypen haben.

+0

Das würde mir in meinem Fall nicht viel helfen ...Ich habe meine Frage vereinfacht: Die Prüffunktionen nehmen jedes Mal andere Parameter an. Danke trotzdem ! – teupoui

Verwandte Themen