grundsätzliche frage zu if
-
xroads42 schrieb:
stell dir mal vor da sind nicht nur a,b, und c, sondern vernünftige ausdrücke!!
z.B.:
[...]
Dasist doch nicht mehr übersichtlich!sind wir heute lustig?
if(a&&b&&c)
;
if(!a&&b&&c)
;ist blödsinn - ich frage mich wie man auf so eine idee kommen kann.
aber darum gings hier ja nicht!!
-
Shade Of Mine schrieb:
sind wir heute lustig?
ja
Shade Of Mine schrieb:
if(a&&b&&c)
;
if(!a&&b&&c)
;ist blödsinn - ...
aber darum gings hier ja nicht!!
Das es darum nicht ging ist mir klar. Ich wollte damit nur zeigen dass wenn man (z.B. durch erweiterungen des Programms) neue fälle braucht, diese art und weise "ifs" zu schreiben, meiner meinung nach micht mehr so übersichtlich ist.
Shade Of Mine schrieb:
ich frage mich wie man auf so eine idee kommen kann.
In dem man komische hirnwindunge hat *g*.
Außerdem habe ich sowas schon öfter gesehn. Stell dir vor du impementierst eine Bitfunktion. Also:a b c | x ------|--- 0 0 0 | x1 0 0 1 | x2 usw.
da wäre solch eine implementation _logisch_ richtig.
Aber das geht nun wirklich am thema vorbei *gg*
-
haltet euch doch mal an die ausgangssituation ....
es ging nur darum was schneller ist ... das zu verschachteln oder alles in eine anweisung zu packen ... das hat nichts mit überischt zu tun ... wenn du dein programm optimierst dann ist es vollkommen egal was mit kompatibilität is ... ist eine frage was du willst ...@xroads42 -> prinzipiell hast du "vielleicht"!!! recht ... aber aufbauend auf die frage leider nicht ... *g* ....... Blade
-
Nein, es ist nicht schneller, weil && immer abkürzt:
a && b
Wenn a schon false ist, dann wird b erst gar nicht abgefragt, weil b das Ergebnis sowieso nicht verändern könnte. Das wirkt so wie ein zusätzliches if(a){ if(b){} }
Bei a || b genauso; wenn a schon true ist, dann ist b egal und wird nicht ausgewertet.Das sieht man z.B. auch an Konstrukten wie
char* p = /* ... */; if(p && *p) { }
-
Wer sagt das der Compiler nicht auch bei if (a == 1 && b == 1 && c == 1){ ... }
schon aus der anweisung geht wenn a zb. == 2 ?
-
666Blade[DC]666 schrieb:
Wer sagt das der Compiler nicht auch bei if (a == 1 && b == 1 && c == 1){ ... }
schon aus der anweisung geht wenn a zb. == 2 ?Das macht er auch, weil keine vollständige boolesche Auswertung wie in Pascal stattfindet. Wollte tag ja auch sagen.
OT: Was ist der Sinn von vollständiger boolescher Auswertung?
-
@Blade
Aber genau das macht er doch. Wenn a==2, dann kann die Bedingung schon nicht mehr erfüllt werden, völlig unabhängig davon, welchen Wert b oder c haben.The operands of logical-AND and logical-OR expressions are evaluated from left to right. If the value of the first operand is sufficient to determine the result of the operation, the second operand is not evaluated. This is called “short-circuit evaluation.” There is a sequence point after the first operand. See Sequence Points for more information
Es gibt da keine schnellere Variante, beide sind gleich schnell.
Wenn man optimiert, dann kann man lediglich die Reihenfolge steuern, z.B. indem man sich diese Verhalten zunutze macht.
Wenn ich a und b habe, und b erfüllt die Bedingung unwahrscheinlicher als a oder b ist sogar indirekt von a abhängig, dann macht es Sinn, if(b && a) anstatt if (a && b) zu prüfen, da ich mich dann nicht mit dem "sinnlosen" auswerten von a beschäftigen muss, wenn b höchstwahrscheinlich sowieso dazu führt, dass das Ergebnis false wird.@aleph
Das würde mich auch mal interessieren... Das konnte ich damals in BASIC schon nicht ausstehen...
-
@tag ... also ist das nur eine frage der übesicht? ... was würdest du denn empfehlen ? verschachtelt oder kombiniert?
-
Wenn da so ein Extrembeispiel wie von dem Herrn 10 Beiträge weiter hinten kommt, dann würde ich zu mehreren ifs oder zumindest zu einer Aufspaltung in mehrere Zeilen tendieren.
if (mensch->isBorn() && Stadt->hier->existiet(VIELLEICHT||ODER||AUCH||NET) && blablub.returnarandomboolean())
Bei sowas "einfachem" wie a==1 && b==1 wäre das wie mit Kanonen auf Spatzen zu schießen
Du musst es so gestalten, dass es hauptsächlich für Dich Übersichtlich ist, und dass am besten auch ein anderer (sprich: Du nach einigen Monaten Pause!) ohne größere Schwierigkeiten dahintersteigt, was dieser Code macht
-
\aleph_0 schrieb:
OT: Was ist der Sinn von vollständiger boolescher Auswertung?
Ich vermute, Optimierungspotential. Umsonst wirds das ja in Sprachen wie Ada und Eiffel nicht geben, wo es dafür unterschiedliche Operatoren gibt:
if Foo and Bar then ... -- vollst. Auswertung if Foo or Bar then ... if Foo and then Bar then ... -- shortcut if Foo or else Bar then ...