oder in if-Klausel

John17.54

Mitglied
Hallo zusammen,

wie kann ich in der if-Klausel mehrere eventuelle Bedingungen abfragen? Was kann ich für das "ODER" einetzen?

if (Bedingung1 ODER Bedingung2) {
...CODE...
}
 

Kababär

Top Contributor
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.
 

Thallius

Top Contributor
Toller Spruch.

Genau genommen stimmt es ja sogar nur ist das natürlich vollkommen irrelevant da beides vollkommen unterschiedliche Operatoren sind, die man niemals im selber Kontext einsetzen würde.

Wer käme auf die Idee

Code:
If (a == b | c == d)

Zu schreiben wenn er nur wissen will ob einer der beiden Ausdrücke true ist. Den binären Oder Operator benutzt man dann wenn einen das Ergebnis interessiert also z.B.

Code:
c = a | b
 

Tarrew

Top Contributor
Ändert ja nichts an der Tatsache, dass er Recht hatte. Deine Antwort machte eher den Anschein als würdest du das nicht wissen.
 

Kababär

Top Contributor
In der Tat lerne ich seit kurzen "theoretische Informatik" sehr intensiv und bin gerade deswegen schonf ast dazu hingerissen, fast alles zu erwähnen was es so zu einem Operator (o.ä.) zu sagen gibt. :D

Der Dozent trimmt uns ganz schön. :oops:
 

JCODA

Top Contributor
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...
Naja, entweder das, oder es sollte die Möglichkeit geben ohne Zusatzvariable auch boolsche Methoden aufrufen zu können, die Seiteneffekte besitzen ...
Natürlich sollte man solche Methoden nicht schreiben, aber naja die Möglichkeit ist da.
 
X

Xyz1

Gast
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.

Und ja, richtig ist, dass beim ...-Operator abgebrochen wird, sobald wahr bei Oder oder falsch bei Und.

Die richtige Stelle der JLS habt ihr ja schon hervorgesucht.
 

Meniskusschaden

Top Contributor
Ist zwar etwas konstruiert, aber es mag vielleicht mal ganz verlockend erscheinen, so etwas schreiben zu können:
Java:
if (loadThis() | loadThat()) {
  processThisAndThat();
}
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 Methode loadThisAndThat() einführen, obwohl es dadurch mehr Code wird.
 

Thallius

Top Contributor
Ist zwar etwas konstruiert, aber es mag vielleicht mal ganz verlockend erscheinen, so etwas schreiben zu können:
Java:
if (loadThis() | loadThat()) {
  processThisAndThat();
}
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 Methode loadThisAndThat() einführen, obwohl es dadurch mehr Code wird.

Also wenn schon, dann müsste deine Methode

LoadThisAndOrThat()

Heißen. Aber so oder so ist das ganze so dermaßen verwirrend, dass ich niemandem raten würde sowas zu machen. Es sei denn er will seinen Arbeitsplatz sichern :)
 

Thallius

Top Contributor
Wer hat hier was von booleans gesagt?

Und 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
 

Meniskusschaden

Top Contributor
Wer hat hier was von booleans gesagt?
Wenn man irgendwo mittels||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.
Und 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
Ich sehe es ja auch so, dassif (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.
 
X

Xyz1

Gast
Es ist so definiert, und fertig.
in der if Head braucht man aber immer boolschen Ausdruck, daher kein bitweises Und/Oder...
Ich nehme an, @Thallius kennt die Unterschiede ganz genau, und will uns nur etwas trollen.
Anfängern bleibt zu sagen, dass es ohne komplexe Methodenaufrufe egal ist,
ob sie | oder || schreiben wollen an der Stelle.
Ansonsten lernt man das hier Angedeutete in der 9. bis 11. Klasse oder im 1. Sem.
(Das muss ich ja nicht 1:1 wiedergeben, sondern kann jeder selber nachlesen tun)
:oops:
 

Meniskusschaden

Top Contributor
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.
Anfängern bleibt zu sagen, dass es ohne komplexe Methodenaufrufe egal ist,
ob sie | oder || schreiben wollen an der Stelle.
Ich würde Anfängern das so nicht sagen, sondern||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.
 

Thallius

Top Contributor
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.

Aehm das ist aber ziemlicher Kappes.

Code:
int a, b;
int c = a | b;

ist alles andere als ein boolean....
 

Meniskusschaden

Top Contributor
Da sind a und b aber auch keine boolschen Ausdrücke und a||bist 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.
 
X

Xyz1

Gast
Okay, nochmal,
bitweises Und/Oder, boolesches(richtig geschrieben?) Und/Oder
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 ;) )
+ "Java" erwartet in dem "Schleifenkopf" selbstverständlich einen booleschen Ausdruck oder Term
 

Meniskusschaden

Top Contributor
Wieso gibt's deswegen jetzt überhaupt so einen Diskussionsbedarf? o_O

Ich wollte dem TE lediglich eine Zusatzinfo mit auf den Weg geben... :D
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.:)
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").
Ja, so war es wahrscheinlich gemeint und das stimmt ja auch. Allerdings liegt folgender Aussage
bitweises Und/Oder, boolesches(richtig geschrieben?) Und/Oder
und letzteres noch in den Varianten schnell oder langsam.
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.
 
X

Xyz1

Gast
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 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.

| ist nach den darauf angewandten Operanden definiert(, auf die es angewandt werden soll.)
(Mein Latein ist nicht so gut, ich kann das nur mit Haupt- und Nebensatz schreiben ;) )

Ich hab jetzt nochmal nachgeschaut,
bitwise inclusive OR
logical "short-circuiting" OR
logical non-"short-circuiting" OR

(für AND analog.)

Sie nennen es also "logisch". Das schnelle boolesche Oder (das habe ich jetzt auch nachgeguckt... der bemitleidenswerte George hieß mit second name Boole!!!!!! (und starb ja auch relativ früh, aber vielleicht nicht wichtig jetzt)) wird aber in den Anfängertutorials nicht aufgeführt - zu hoch ist wahrscheinlich die Konfusion/Konfusität.

Ganz wichtig ist auch noch zu erwähnen, dass arithmetik in dem "Schleifenkopf" absolut verboten ist. :)
 

Meniskusschaden

Top Contributor
| 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.

Ich habe eben mal folgende Klasse erstellt:
Java:
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");
        }
    }
}
und mir dazu den Bytecode angesehen:
Code:
  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
Man sieht in den Zeilen 4-6 und 15-17, dass da exakt dasselbe passiert. Auf der Ebene scheint es einfach ein bitweises integer Oder zu sein.
 
X

Xyz1

Gast
Yeah, intern ist das so, da werden boolean ja auch mit 0000... und 1111... repräsentiert.
Deswegen ist's sinnvoll, "arithmetisch" zu rechnen.
Eine Abstraktionsebene höher, sind's aber "logische" Verknüpfungen.
Also, "effektiv" Zahlen, "fiktiv" Junktionen - würd ich das jetzt umschreiben. o_O
 

Ähnliche Java Themen

Neue Themen


Oben