Code:if(bedingung1 || bedingung2){...}
Ein "||" prüft so viele Bedingungen wie es nötig ist, um ein Ergebnis zu erhalten und prüft dann die weiteren Bedingungen nicht mehr.
Ein "|" prüft alle Bedingungen.
Wo hast du das denn her?
The conditional-or operator || operator is like | (§15.22.2), but evaluates its righthand operand only if the value of its left-hand operand is false.
If (a == b | c == d)
c = a | b
Ändert ja nichts an der Tatsache, dass er Recht hatte. Deine Antwort machte eher den Anschein als würdest du das nicht wissen.
Naja, entweder das, oder es sollte die Möglichkeit geben ohne Zusatzvariable auch boolsche Methoden aufrufen zu können, die Seiteneffekte besitzen ...Sagen wir es war mir nicht bewusst das man es so sinnlos definieren kann. Da war halt mal wieder ein ganz findiger Theoretischer Informatiker an der Tastatur...
Der Compiler prüft nunmal nicht die Semantik - was, nebenbei bemerkt, auch nur eingeschränkt möglich ist. Hat nix mit dem Intelligenzquotienten des Informatikers zu tun.Sagen wir es war mir nicht bewusst das man es so sinnlos definieren kann. Da war halt mal wieder ein ganz findiger Theoretischer Informatiker an der Tastatur...
Nicht ganz. Für die dynamische Semantik (wie hier gefragt) hast du natürlich recht, allerdings gibt es eben auch die statische Semantik, welche vom Compiler geprüft wird (z.B. Typsicherheit).Der Compiler prüft nunmal nicht die Semantik - was, nebenbei bemerkt, auch nur eingeschränkt möglich ist.
if (loadThis() | loadThat()) {
processThisAndThat();
}
loadThisAndThat()
einführen, obwohl es dadurch mehr Code wird.Ist zwar etwas konstruiert, aber es mag vielleicht mal ganz verlockend erscheinen, so etwas schreiben zu können:
Aber ich glaube, ich würde es möglichst vermeiden, weil mir die Gefahr zu groß wäre, dass es mal versehentlich zu || "korrigiert" wird, so dass die That-Daten nur noch gelegentlich verarbeitet werden. In diesem Beispiel würde ich wahrscheinlich lieber die zusätzliche MethodeJava:if (loadThis() | loadThat()) { processThisAndThat(); }
loadThisAndThat()
einführen, obwohl es dadurch mehr Code wird.
Hätte man es denn anders definieren können? Es ist doch einfach die Art, wie ein bitweises Oder nun einmal funktionieren muß, wenn man es auf Booleans anwendet. Wie sollte es denn sonst sein?Sagen wir es war mir nicht bewusst das man es so sinnlos definieren kann. Da war halt mal wieder ein ganz findiger Theoretischer Informatiker an der Tastatur...
Wenn man irgendwo mittelsWer hat hier was von booleans gesagt?
||
eine Bedingung prüft, stehen links und rechts davon doch immer boolesche Werte. Ein alternativ eingesetztes bitweises Oder ist an dieser Stelle also zwangsläufig ein bitweises Oder zwischen boolschen Ausdrücken.Ich sehe es ja auch so, dassUnd bei booleans ist es ja wohl noch unsinniger
a | b abzufragen statt a || b da man damit erstmal auf jeden Fall die bitweise Operation ausführt und dann einen Vergleich , statt einfach nur einem Vergleich oder eventuell zwei vergleiche falls a false ist
if (a | b) ...
eigentlich nur ein Programmiertrick ist und deshalb mit Bedacht oder gar nicht verwendet werden sollte. Mit meinem Posting wollte ich nur darauf aufmerksam machen, dass es keine sinnlose Definition der JLS ist, sondern eine Notwendigkeit.||
und|
durchaus kennen, nicht bewußt ist, dass |
im Allgemeinen kein etwas anderer Boolscher Operator ist, sondern eine Berechnung, deren Ergebnis in solchen Fällen eben immer ein Boolean ist und deshalb in diesem Kontext eine Nutzung als Boolscher Operator möglich ist.Ich würde Anfängern das so nicht sagen, sondernAnfängern bleibt zu sagen, dass es ohne komplexe Methodenaufrufe egal ist,
ob sie | oder || schreiben wollen an der Stelle.
||
als korrekte Antwort im Sinne des TE nennen. |
würde ich erst später in's Spiel bringen. Letzteres würde ich als schlechten Programmierstil ansehen, bis auf begründete Einzelfälle, die es vielleicht geben mag.Dennoch glaube ich , dass es nicht so augenfällig ist, was jeweils passiert und dass es auch Einigen, die das unterschiedliche Verhalten von||
und|
durchaus kennen, nicht bewußt ist, dass|
im Allgemeinen kein etwas anderer Boolscher Operator ist, sondern eine Berechnung, deren Ergebnis in solchen Fällen eben immer ein Boolean ist und deshalb in diesem Kontext eine Nutzung als Boolscher Operator möglich ist.
int a, b;
int c = a | b;
a||b
ist deshalb nicht möglich. Das hat mit dem hier diskutierten Thema also nichts zu tun. Ich habe ja gerade geschrieben, dass|
im Allgemeinen eben kein boolscher Operator ist, sondern nur dann so genutzt werden kann, wenn man ihn auf Booleans anwendet, was ja immer der Fall ist, wenn man ihn als Ersetzung von||
in einer if-Abfrage benutzt.Ja, doch, @Thallius trollt im Moment.ist alles andere als ein boolean....
Ich glaube, ja, da der Typ Boole hieß ^^boolesches(richtig geschrieben?)
Ehrlich gesagt ist mir nicht klar, was du hier mit schnell/langsam meinst. Na ja, ich gehe jetzt erst mal joggen und denke darüber nach.und letzteres noch in den Varianten schnell oder langsam.
(Ich weiß, dass die Begrifflichkeiten 'schnell'/'langsam' nicht ganz korrekt sind, aber die solltet ihr eigentlich kennen )
Wahrscheinlich, dass das eine (||) abbricht, sobald es einen true-Wert gibt, und das andere (|) die anderen trotzdem noch auswertet, auch wenn es schon einen true-Wert gibt (ist "langsamer").Ehrlich gesagt ist mir nicht klar, was du hier mit schnell/langsam meinst.
Finde ich auch immer wieder faszinierend, welche Einsichten man aus solchen einfachen Sachverhalten häufig noch gewinnen kann. Ich glaube, die Frage des TE wurde vernünftig beantworten, so dass die weitere Diskussion nicht davon ablenken sollte.Wieso gibt's deswegen jetzt überhaupt so einen Diskussionsbedarf?
Ich wollte dem TE lediglich eine Zusatzinfo mit auf den Weg geben...
Ja, so war es wahrscheinlich gemeint und das stimmt ja auch. Allerdings liegt folgender AussageWahrscheinlich, dass das eine (||) abbricht, sobald es einen true-Wert gibt, und das andere (|) die anderen trotzdem noch auswertet, auch wenn es schon einen true-Wert gibt (ist "langsamer").
dann die Idee zugrunde, dass es quasi zwei |-Operatoren gibt, die kontextabhängig entweder zur Berechnung des bitweisen Oder oder zur Ermittlung eines Wahrheitswertes dienen. Meine These aus den vorherigen Postings ist aber, dass es nur das bitweise Oder gibt und dass das "langsame" boolesche Oder überhaupt nicht existiert. Es wird immer das bitweise Oder prozessiert. Deshalb hätte man das (nicht existierende) "langsame" boolesche Oder in der JLS natürlich auch nicht weglassen können. Es ist nämlich gar nicht drin.bitweises Und/Oder, boolesches(richtig geschrieben?) Und/Oder
und letzteres noch in den Varianten schnell oder langsam.
Ist ja auch völlig richtig so. Aber das müsste man eigentlich wissen, jedenfalls war ich der Annahme, das sei selbstverständlich, und bedürfe keiner Diskussion.Ja, so war es wahrscheinlich gemeint und das stimmt ja auch. Allerdings liegt folgender Aussage
dann die Idee zugrunde, dass es quasi zwei |-Operatoren gibt, die kontextabhängig entweder zur Berechnung des bitweisen Oder oder zur Ermittlung eines Wahrheitswertes dienen.
|
ist nach den darauf angewandten Operanden definiert(, auf die es angewandt werden soll.)Richtig, und in der JLS wird es dann offenbar tatsächlich als Boolescher Operator bezeichnet und nicht als bitweises Oder. Demzufolge ist die Benennung genau anders herum als ich dachte und es gibt keinen eigenen Operator für bitweises Oder zwischen Booleans bzw. - wenn es begrifflich besser gefällt - es ist in Java dasselbe. Das war ja eigentlich mein Ausgangspunkt: als Sprachentwickler kann man kaum das Eine herausnehmen und das Andere drin lassen.| ist nach den darauf angewandten Operanden definiert(, auf die es angewandt werden soll.)
public class Oder {
public static void main(String[] args) {
boolean a = true;
boolean b = true;
boolean c = a|b;
System.out.println(c);
if (a|b) {
System.out.println("a oder b");
}
}
}
public static void main(java.lang.String[] args);
0 iconst_1
1 istore_1 [a]
2 iconst_1
3 istore_2 [b]
4 iload_1 [a]
5 iload_2 [b]
6 ior
7 istore_3 [c]
8 getstatic java.lang.System.out : java.io.PrintStream [16]
11 iload_3 [c]
12 invokevirtual java.io.PrintStream.println(boolean) : void [22]
15 iload_1 [a]
16 iload_2 [b]
17 ior
18 ifeq 29
21 getstatic java.lang.System.out : java.io.PrintStream [16]
24 ldc <String "a oder b"> [28]
26 invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]
29 return