if (dies && das) frage;
-
Ich denke Mis2com bezog sich auf die zweite Frage.
-
naja das is ne frage der lesbarkeit... besonders im team
-
Ja, meine Antwort war auf die zweite Frage.
Der Compiler wird es nicht wegoptimieren; wenn man innerhalb eines if-Ausdrucks zwei Funktionen, die performancetechnisch wohl einiges ausmachen, in Relation setzt, kann so etwas durchaus auch etwas ausmachen, nur geschieht so etwas meiner Meinung nach selten.
Der Compiler kann es insofern nicht optimieren, als dass er die Performance der Funktionen nicht kennen kann, weil diese erst zur Laufzeit bestimmt werden kann.MfG MAV
-
Aber nicht die Klammerung vergessen!
Denna == b && c == d
wird als
a == (b && c) == d
interpretiert, da && die größere Priorität (?) hat.
Sicherer ist in diesem Fall hier das Weglassen von true (wie bereits gesagt) oder eine explizite Klammerung.
edit: Noch viiieeel sicherer ist das Denken vor dem Posten.
-
absolute_beginner schrieb:
Aber nicht die Klammerung vergessen!
Denna == b && c == d
wird als
a == (b && c) == d
interpretiert, da && die größere Priorität (?) hat.
das wage ich zu bezweifeln
-
-
*argh*
Hm... erst denken, dann posten.
Tatsächlich ist es natürlich genau anders... == ist stärker als &&.Naja, ist ja noch mitten in der Nacht...
-
Entyl_Sa schrieb:
Wenn das_ok() schon false ist, dann wird bei einer && Verknüpfung die nächste Bedinung garnicht erst ausgewertet. Die Abfrage == true kannst du dir übrigens sparen.
if(das_ok() && dies_ok()){ }
reicht.
Und wieder was gelernt. Wusste garnicht dass C++ lazy evaluation benutzt.
-
Hm, das ist einfach logisch, dass das so geht.
Sowas wie:if(a() == true)
ist genau so überflüssig, wie:
if((var == 100) == true)
if erwartet einen bool (alles andere wird implizit gecastet, wenn es geht) und wenn da true steht, dann muss mann nicht true==true überprüfen...
-
hmmm... moment mal! was passiert dann eigentlich, wenn ich folgenden code habe:
bool foo() { cout << "Ich bin bereit!"; return true; } bool bar() { cout << "Hallo, Welt!" << endl; return false; } int main() { if(bar() && foo()) { //tu irgendwas } }
krieg ich dann aufgrund der lazy evaluation das "Ich bin bereit!" garnicht zu sehen? bar() gibt ja sowieso false zurück, also bräuchte doch er theoretisch foo() garnichtmehr ausführen.
Oder hab ich das falsch verstanden?
geloeschtP.S.: Ich weiß, das beispiel ist ziemlich schlechter stil
-
es ist nicht spezifiziert, ob (lazy oder nicht) und in welcher reihenfolge die operanden ausgewertet werden
-
0rp schrieb:
es ist nicht spezifiziert, ob (lazy oder nicht) und in welcher reihenfolge die operanden ausgewertet werden
das wage ich zu bezweifeln.
-
Shade Of Mine schrieb:
0rp schrieb:
es ist nicht spezifiziert, ob (lazy oder nicht) und in welcher reihenfolge die operanden ausgewertet werden
das wage ich zu bezweifeln.
4 Except where noted, the order of evaluation of operands of individual
operators and subexpressions of individual expressions, and the order
in which side effects take place, is unspecified. Between the previ-
ous and next sequence point a scalar object shall have its stored
value modified at most once by the evaluation of an expression. Fur-
thermore, the prior value shall be accessed only to determine the
value to be stored. The requirements of this paragraph shall be met
for each allowable ordering of the subexpressions of a full expres-
sion; otherwise the behavior is undefined. [Example:
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // `i' becomes 9i = ++i + 1; // the behavior is undefined
i = i + 1; // the value of 'i' is incremented
--end example]
-
Hallo,
4 Except where noted,[...]
und genau hier gibt es eben eine Ausnahme bei den logischen Operatoren, einer der Grundsätze ("short circuit") in C/C++ ist von diesem Punkt nicht betroffen, denn (nur, um das jetzt auch mal mit einem Zitat aus dem Standard zu "beweisen"):
The && operator groups left-to-right.
The operands are both implicitly converted to type bool (clause 4).
The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right
evaluation: the second operand is not evaluated if the first operand is false.MfG
-
short cut evaluation
-
Unlike &, && guarantees left-to-right evaluation
nagut, hast gewonnen
-
wenn ihr euch schon mit dem standard auseinandersetzt mal ne ähnliche frage
int result=0;
if(success!=(result=func()))
return error;ich benutzt sowas recht gern um in einer zeile nen wert zu speichern
und auf fehler zu prüfen
hab aber von nem kollegen gehört dass hier nich immer success!=result geprüft
wirdwas meint ihr (der zweifler war n vb programmierer
)
-
Wenn func() nicht grad ne Exception wirft, müsste der Vergleich IMO schon durchgeführt werden.
-
Und ihr denkt auch an folgendes:
bool operator&& (const INTEGER &lhs, const INTEGER &rhs) { return (lhs.var && rhs.var); } class INTEGER { public: INTEGER (int i = 0) : var(i) {} friend bool operator&& (const INTEGER &lhs, const INTEGER &rhs); private: int var; }; INTEGER CloseDB (DBHANDLE *hDB) { CloseDBConnection (hDB); return INTEGER (1); // Erfolgreich beendet } INTEGER GetStatus () { // Prüfen ob noch etwas getan werden muss return INTEGER (0); // Es gibt noch etwas zu tun } void DoUpdate (DBHANDLE &hDB); // Aktualisiert Datensätze DBHANDLE * OpenDB (); // Stellt eine DB Verbindung her int main () { DBHANDLE *hDB = OpenDB (); DoUpdate (hDB); if (GetStatus () && CloseDB (hDB)); return 0; }
Edit:
Typo
-
IMO gibt es keinen Grund, operator&& zu überladen. Davon abgesehen, ist das in dem Fall wohl besser, den operator '==' zu nennen!