2013-02-21 12 views
11

Ich schreibe etwas C++ - Code, und ich möchte zwei Funktionen (checkXDirty und checkYDirty) aufrufen und true zurückgeben, wenn entweder true zurückgibt. Ich brauche zu bewerten beide auch wenn man true zurückkehrt, so mein erster Gedanke warIst (bool | bool) sicher?

return checkXDirty() | checkYDirty(); 

Das sieht ein wenig seltsam zu verwenden (schmutzig, vielleicht). Produziert dies immer das korrekte Ergebnis in C++? Was ist mit C, mit dem _Bool Typ? (Dieser Code könnte für beide Sprachen angepasst werden, und ich möchte keine unangenehmen Überraschungen, wenn ich den Code portiere).

+3

Okey, okey. Nun, ich würde sagen, dass dies eine wirklich schlechte Idee ist, 'isSomething()' Funktionen mit Nebenwirkungen zu haben. – Andrey

+0

@Andrey: Guter Punkt. Ich werde die Funktionen stattdessen in 'check ...' umbenennen. – nneonneo

+2

@MitchWheat haben sie bitweise ODER genau, um eine Kurzschlussauswertung zu vermeiden. – juanchopanza

Antwort

46

Ich brauche beide auch zu bewerten, wenn ein true zurück, so mein erster Gedanke zu verwenden war ...

Dann aufhören zu versuchen, schwierig zu sein und Ihren Code fit in so wenige Zeilen wie möglich zu machen . Nur die beiden Funktionen aufrufen und deutlich machen, dass sie müssen genannt werden:

const bool x_dirty = is_x_dirty(); 
const bool y_dirty = is_y_dirty(); 
return x_dirty || y_dirty; 

Als nächstes umbenennen oder Ihre Funktionen als is_xxx_dirty auseinander brechen sollte wirklich nicht produzieren Nebenwirkungen. Ihr Code ist schwieriger zu verwalten als Ergebnis

+0

Ich habe sie in 'check *' umbenannt, weil 'is *' irreführend war. Vielen Dank. – nneonneo

+3

@nneonneo: Ich würde sagen, das ist immer noch irreführend. Ich würde nicht erwarten, dass eine dieser Funktionen Nebenwirkungen hervorruft. –

+4

+1 Ich habe einmal den gleichen Hack mit '|' ausprobiert und die Reihenfolge der Auswertung vergessen, die für meinen Code wichtig war. –

8

Solange die Werte nicht unbestimmt sind, ist es technisch in Ordnung, die bitweisen Operatoren zu verwenden. Da dies jedoch mit Problemen behaftet ist, würde ich stattdessen einfach eine kleine Inline-ODER-Funktion schreiben und den Compiler optimieren lassen. Der Compiler ist gut in der Optimierung, also, lass es.

return eitherOrBothTrue(checkXDirty(), checkYDirty()); 

Oder vielleicht, wenn Sie mutig und wagen auf die Herausforderung anzunehmen, den Code zu denjenigen erklären, die es halten wird,

return !bothFalse(checkXDirty(), checkYDirty()); 

Oder jetzt, dass ich @EdS‘Antwort lesen, ist vielleicht genauso gut, nur die Werte in Variablen zu speichern, aber fügen Sie dann const, wie folgt hinzu: