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?
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) –