Liebe Kollegen/innen,
wenn ich in Java z.b. in einer if (oder auch while) Bedingung zwei oder mehrere Bedingungen abfragen will, wie wird das realsisert, also z.B nicht nur
if (a>0)
{a-=1;}
else
{blablabla}
sonderich möchte z.B. bei der if Abfrage voraussetzen, dass a>0 und dass a>b ist - oder auch dass nur eine der beiden Bedingungen erfüllt ist also
if
(a>0 und a>b)
{blabla}
usw.
oder
if
(a>0 oder a>b)
blabla
Kann mir jemand sagen wie ich in Java diese zwei oder mehr Bedingungen realisiere. Ich habe es nicht in meinem Buch gefunden.
Danke für die Mühe
dass a>0 und dass a>b ist - oder auch dass nur eine der beiden Bedingungen erfüllt ist
hmm, fangen wir mal mit F1 an ;-)
Ich geh hier mal davon aus, dass a und b boolsche ausdrücke egal welcher art sind.
UND a, | !a,
b |true | false
!b |false| false
ODER a, | !a,
b |true | true
!b |true | false
Was ich jetzt damit sagen wollte ist, dass wenn (a oder b) true ist, dann ist auf jeden fall auch (a und b) true, also brauchst du nur
if(a || b)
zu schreiben.
mit Zahlen geht es auch,
und entspricht &&
oder entspricht ||
und auf genügend Klammern achten
if (((a>0) && (a>b)) || (b == 23)) {
a = -12;
}
Was ich jetzt damit sagen wollte ist, dass wenn (a oder b) true ist, dann ist auf jeden fall auch (a und b) true, also brauchst du nur if(a || b)
zu schreiben.
Stimmt nicht, z.B. wenn a==true und b==false
Da hat wohl jemand in F1 nicht aufgepasst :)
Was ich jetzt damit sagen wollte ist, dass wenn (a oder b) true ist, dann ist auf jeden fall auch (a und b) true, also brauchst du nur
if(a || b)
zu schreiben.
Stimmt nicht, z.B. wenn a==true und b==false
Ich mein das natuerlich genau andersrum, also wenn (a und b) true ist, dann ist auch (a oder b) true.
hast dich ja noch mal reten können [img]
http://www.fb18.de/gfx/22.gif[/img]
Edit: retten
um nochmal zu der eigentlichen Frage zurück zu kommen [img]
http://www.fb18.de/gfx/25.gif[/img]:
& sowie && sind die Konjunktions- (Und-) Operatoren,
| und || sind die Disjunktions- (Oder-) Operatoren.
Der Unterschied besteht einfach darin, daß && bzw. || nur das erste Argument auswerten, falls danach schon klar ist, was als Wahrheitswert heraus kommt, wogegen & und | auf jeden Fall den ganzen Ausdruck auswerten. Das kann wichtig sein, wenn du z.B. als zweites Argument eine Funktion aufrufst, die einen Boolean-Wert zurück gibt, und aber auch ein paar Variablen verändert oder Ähnliches.
Und weil's so schön ist, hier (mal wieder) ein Tipp zu kostenloser Literatur zu Java:
http://www.java-tutor.com/javabuch/online.htm
um nochmal zu der eigentlichen Frage zurück zu kommen [img]http://www.fb18.de/gfx/25.gif[/img]:
& sowie && sind die Konjunktions- (Und-) Operatoren,
| und || sind die Disjunktions- (Oder-) Operatoren.
Der Unterschied besteht einfach darin, daß && bzw. || nur das erste Argument auswerten, falls danach schon klar ist, was als Wahrheitswert heraus kommt, wogegen & und | auf jeden Fall den ganzen Ausdruck auswerten.
Ich denke der wichtigste Unterschied ist, dass && und || AUSSCHLIESSLICH bool'sche Werte miteinander verknüpfen, wohingegen die & und | Operatoren AUCH auf integer Werten definiert sind. Wenn man 0 als false und alle anderen Werte als true definiert, funktionieren die natürlich so wie && und || nur mit dem schon erwähnten Unterschied des evtl. frühzeitigen Abbruchs.
wohingegen & und | Operatoren auf integer Werte sind.
Oder aber auf booleans. Ich wollte auch zuerst aufschreien, aber & und | sind wirklich nicht nur auf (int, int) definiert, sondern auch auf (boolean, boolean). Und wenn man nur booleans betrachtet ist die Kurzschlussauswertung wirklich der einzige Unterschied zu && bzw. ||.
Wuerg! Ich *hasse* diese Moechtegern-C-Sprachen.
& und | verknuepfen bitweise, && und || verknuepfen logisch. (also Booleans). Da der Typ "boolean" nur ein Bit repraesentiert, ist & und && fuer "booleans" natuerlich gleichbedeutend (wobei, wie schon unten gesagt, der Unterschied gilt, dass bei & alle verknuepften Ausdruecke ausgewertet werden, bei && nur solange (von links nach rechts) bis das Ergebnis feststeht.).
Fuer Integers allerdings ist & noch definiert. && nicht. (in C sieht das wieder anders aus.)
Das mit der "solange bis das Ergebnis feststeht"-Auswertung hat eigentlich nur dann einen Effekt, wenn einige der verknuepften Ausdruecke Funktionen mit Nebeneffekten sind, die dann Wahlweise ausgefuehrt werden, oder auch nicht.
in C zB sind:
if (a) printf("foobar");
und
a && printf("foobar");
dasselbe.
MoKrates
Wenn man 0 als false und alle anderen Werte als true definiert, funktionieren die natürlich so wie && und || nur mit dem schon erwähnten Unterschied des evtl. frühzeitigen Abbruchs.
Hm, ich merke gerade, für & stimmt das ja gar nicht. Wenn a==1 und b==2, dann ist a&b == 0
Foo.java:3: not a statement
b && baz();
^
1 error
Och menno …
Ach du auch? [img]http://www.fb18.de/gfx/15.gif[/img]
Ich mag C. Und nachdem ich das Paper »Evolution of C« teilweise gelesen habe, noch mehr.
http://www.fh-jena.de/~kleine/history/languages/Ritchie-CHistory-HOPL2paper.pdf
Felix schrieb:
Der Unterschied besteht einfach darin, daß && bzw. || nur das erste Argument auswerten, falls danach schon klar ist, was als Wahrheitswert heraus kommt, wogegen & und | auf jeden Fall den ganzen Ausdruck auswerten. Das kann wichtig sein, wenn du z.B. als zweites Argument eine Funktion aufrufst, die einen Boolean-Wert zurück gibt, und aber auch ein paar Variablen verändert oder Ähnliches.
Hörte ich nicht mal, daß man solche Nebenwirkungen bei Prädikaten und Funktionen vermeiden soll? [img]
http://www.fb18.de/gfx/25.gif[/img]
Ernsthaft: Dieser vorzeitige Abbruch bei der Auswertung boolscher Ausdrücke ist auch bei diesem netten Idiom sehr praktisch:
if (sum != null && sum.isPositive()) { ... }
"&" kann man nicht benutzen, da man sonst eine NullPointerException bekommt, wenn sum null ist.
Und weil's so schön ist, hier (mal wieder) ein Tipp zu kostenloser Literatur zu Java:
http://www.java-tutor.com/javabuch/online.htm
Dann aber bitte nicht nur einen Link zu einer Online-Version, sondern direkt zu der eigentlichen Hompage des Buches:
http://www.galileocomputing.de/openbook/javainsel3/ (Wobei ich "Java ist auch eine Insel" nicht
so grandios finde. OK, aber, was ich bisher gelesen habe, mit deutlichen Schwächen.)
Zu dem Punkt & vs. && kann man auch gut in die
offizielle "Java Language Specification" ab 15.22 gucken.
Mo schrieb:
Wuerg! Ich *hasse* diese Moechtegern-C-Sprachen.
Auch wenn sich Java an C in einigem orientiert, so ist es eben doch eine eigene Sprache. Und "&", "|", "^" sind (ebenso wie "+") dort halt überladene Operatoren.
low schrieb:
Foo.java:3: not a statement
b && baz();
^
1 error
Och menno …
Sorry, in Java ist "0[a]" auch kein alias für "a[ 0]". [img]
http://www.fb18.de/gfx/24.gif[/img]
(Lows Code-Umgebung durch eine Quote-Umgebung ersetzt, weil es hier einen
Fehler in Unimatix/Rapidforum gibt.)
to_be || !to_be == 1, to_be | ~to_be == -1
Wo ist da der Fehler? Eine binäre "1" kann ja sowohl als 1 als auch als -1 gedeutet werden.
to_be || !to_be == 1, to_be | ~to_be == -1
Wo ist da der Fehler?
Da ist keiner. Beide Ausdrücke sind AFAICS in C immer wahr.
Hörte ich nicht mal, daß man solche Nebenwirkungen bei Prädikaten und Funktionen vermeiden soll? [img]http://www.fb18.de/gfx/25.gif[/img]
Würde ich natürlich auch nie wagen, dem zu widersprechen [img]
http://www.fb18.de/gfx/22.gif[/img], es gibt aber sicher auch Leute, die das anders handhaben - und z.B. Booleans als Rückgabewerte nutzen um anzuzeigen, ob eine Prozedur fehlerfrei ausgeführt werden konnte oder nicht.
Dann aber bitte nicht nur einen Link zu einer Online-Version, sondern direkt zu der eigentlichen Hompage des Buches: http://www.galileocomputing.de/openbook/javainsel3/ (Wobei ich "Java ist auch eine Insel" nicht so grandios finde. OK, aber, was ich bisher gelesen habe, mit deutlichen Schwächen.)
mir ging's ja nur darum, daß, auch wenn man partu (wie das wohl richtig geschrieben wird) kein Geld ausgeben möchte, immer noch ordentliche Literatur bekommen kann um Java zu lernen. Und das obige Buch deckt IMHO alle wichtigen Einstiegsbereiche ab. Bücher, die die diskutierten Operatoren nicht an prominenter und leicht zu findender Stelle abhandeln, muß man sich einfach nicht antun [img]
http://www.fb18.de/gfx/23.gif[/img].