Wie oft "&&" und "||" in einer if Abfrage?
-
Hallo zusammen!
Ich habe jetzt schon eine ganze Zeit lang danach gesucht, aber bisher keine vernünftige Antwort gefunden. Dazu muss ich sagen, ich bin ein Newbie in der Programmierung und weiß vielleicht nicht richtig, wo ich suchen muss..

Naja, meine Frage:
Wie oft darf man "&&" und "||" in einer if Abfrage benutzen?
also zB.:
if(((a<b) && (a>b1) && (c<d) && (c>d1))||((e<f) && (e>f1) && (g<h) && (g>h1))||...
{
...
}Vielen Dank im Voraus!
iop
-
egal wie oft...
-
Hallo,
iop schrieb:
Wie oft darf man "&&" und "||" in einer if Abfrage benutzen?
so oft du willst (selbst der längste Ausdruck wird ja eh nur zu true oder false ausgewertet). Allerdings leidet irgendwann die Lesbarkeit

MfG
GPC
-
Ich würde mal dreist behaupten, dass Ausdrücke beliebig lang werden dürfen, da sie sowieso vom Compiler auseinandergenommen werden.
Allerdings würde ich dir empfehlen, gleichen Code auszulagern:template <typename T> bool f (T const& l, T const& m, T const& r) { return (m < r) && (m > l); } // ... if((f (b1, a, b) && f (d1, c, d)) || (f (f1, e, f) && f (h1, g, h)) || ...) { // ... }Das sollte eigentlich keinen Geschwindigkeitsunterschied machen. Wofür brauchst du das überhaupt?
-
@.filmor: deinen code verstehe ich leider nicht (mit templates habe ich noch nicht gearbeitet - überhaupt, ist das ein template??! -> du siehst meine unwissenheit). kannste das eventuell etwas erklären?
template <typename T> bool f (T const& l, T const& m, T const& r) { return (m < r) && (m > l); } // ... if((f (b1, a, b) && f (d1, c, d)) || (f (f1, e, f) && f (h1, g, h)) || ...) { // ... }im allgemeinen geht es um ein 2D flugspiel (ansicht von oben). dabei versuche ich eine kollisionsabfrage hinzubekommen. genauer gesagt: jedes objekt hat einen zentralen punkt, aus dem ich ein rechteck berechne, welches das objekt umfasst. jeder eckpunkt (eines gegnerschiffes) soll immer abgefragt werden, ob er zB auf der vom spielerschiff errechneten ebene liegt. das heißt, ich brauche diese if abfrage, die "ziemlich" lang wird, wenn für vier punkte (x und y koordinate) jeweils geguckt wird, ob sie zwischen zwei eckpunkten einer "gegnerebene" liegen..... so ungefähr jedenfalls..

vielen dank schonmal für die schnelle hilfe jedenfalls!
-
solltest du für solche aufgaben nicht schon etwas besser c++ können?
es ist nicht gerade leserlich soviel elemente in eine abfrage zu schreiben.
man überblickt einfach später nicht mehr wie was ausgewertet wird.
du weisst ja schon das es zum abbruch kommt sobald eine abfrage zu false ausgewertet wird?!
a || b || c -> ist a wahr ist der ganze ausdruck wahr
a && b && c -> ist a unwahr kann der ausdruck nicht mehr wahr werdendas kann, wenn es so unübersichtlich ist, gefährlich werden, weil kaum überblickbar.
modularisierung, auslagerung von teilaufgaben ist hier das stichwort.
nur das tun was nötig ist und nicht wollmilchsau ..... blabla
-
@ kuckucks: du hast recht, der überblick geht schnell verloren, daher verfasse ich nebenbei eine mehr oder weniger ausführliche dokumentation. außerdem ~lerne ich gerade c++, dh, ich fange einfach an, probiere herum und merke, anders müsste es besser gehen - dann probiere ich es wieder anders und habe schon wieder was gelernt... etc.
a || b || c -> ist a wahr ist der ganze ausdruck wahr
a && b && c -> ist a unwahr kann der ausdruck nicht mehr wahr werdendas weiß ich, trotzdem danke, man kann sowas ja nie oft genug hören

das problem mit der übersichtlichkeit ist doch, dass man es von anfang an übersichtlich machen muss - und vor allem auch machen können muss, rein vom "Können" her... und da hoffe ich auf gutem wege zu sein.
-
Der Übersichtlichkeit hilft es enorm wenn man entweder Teilausdrücke benennt (sollte dann halt ein sinnvoller & sprechender Name sein), oder aber ein bestimmtes Pattern einhält und entsprechend formatiert:
void Foo::Bar(int a, int b) { // -- benannte Teilausdrücke -- // NOTE: geht nur wenn alle Teilausdrücke auch immer ausgewertet werden dürfen, // die Auswertung der Teilausdrücke für isAInRange und isBInRange darf also // in diesem Fall keine unerwünschten Nebeneffekte haben. bool isAInRange = (m_minA <= a) && (a <= m_maxA); bool isBInRange = (m_minB <= b) && (b <= m_maxB); bool isWhateverCondition = ...; if(isWhateverCondition || (isAInRange && isBInRange)) { DoWhateverThingy(a, b); } } void Foo::Baz(int a, int b) { // -- formatiert -- if((a < b) && (a != 0) && (b != 0) && ((a == 1) || (b == 1)) && DoIHaveToDoThis() ) { DoOtherThing(); } }Und wer boolsche Operatoren als "if" misbraucht gehört sowieso gedroschen

-
hey,
diese "void Foo::Bar(int a, int b)" ist ja echt der clou! da müsste man selbst drauf kommen

hm, ganz im ernst, sowas ist echt hilfreich denke ich, und wahrscheinlich auch erst der anfang der trickkiste zur aufbesserung der übersichtlichkeit usw.
..ich hoffe ja, durch dieses forum ein wenig lernen zu können. aber wo sonst lernt man sowas? gibt es dafür standards? die man auch irgendwo frei zugänglich nachlesen kann?
..naja, ist schon spät :p