Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Warum funktioniert mein If Statement nicht richtig?
Liebe Java-Nutzer,
ich wäre sehr dankbar für eure Hilfe. Ich bin wirklich ganz unerfahren mit dem Programmieren im allgemeinen und somit auch mit Java.
In meinem Java Übungsbuch programmieren wir ein Mini-Programm, dass mir sagen soll ob ein in einem "JOptionPane" eingegebener, kleingeschriebener Buchstabe ein Vokal ist oder nicht. Dazu benutzen wir "if Statements": Viele davon untereinander verschachtelt:
if (c == 'a') { istVokal = true; } else { if (c == 'e') { istVokal =true; } und so weiter und so fort.
Um mir die komplizierte if Verschachtelung zu sparen dachte ich, ich probiere es mal alle Bedingungen in nur ein if Statement zu packen, also:
if (c == 'a' | c == 'e' | c == 'i') { istVokal = true; }
Ich habe mich sehr gefreut, als das tatsächlich funktionierte.
Dann habe ich probiert es noch mehr zu vereinfachen. Und zwar so:
if (c == ('a' | 'e' | 'i' | 'o' | 'u')) { istVokal = true; }
aber jetzt klappt es nicht mehr. Egal welchen Buchstaben ich nun in mein JOptionPane eingebe, ich bekomme die Antwort: ist kein Vokal (diese Antwort kommt sozusagen, wenn der definierte boolean "istVokal" == false ist.
Ich hoffe das macht Sinn. Könnt ihr mir erklären, warum mein letzter Versuch nicht mehr funktioniert?
Danke.
Der gerade Strich | ist ein bitweises Oder. Durch 'a' | 'e' wird also das bitweise Oder auf die beiden Operanden 'a' und 'e' angewandt. Da beide Operanden nur Zahlen sind (ASCII), ist das Ergebnis auch wieder eine Zahl. Zum Schluss vergleichst du also eine Zahl c via == mit einer anderen Zahl.
Weiter als if (c == 'a' | c == 'e' | c == 'i') kannst du es nicht vereinfachen. Allerdings solltest du anstatt | besser || benutzen, dass ist ein Kurzschlussoperator. Angenommen c sei wirklich 'a', dann würde bei if(c=='a' || c=='e) der zweite Vergleich gar nicht ausgeführt werden, da ja schon der erste true liefert und somit das Oder bereits erfüllt ist. Bei dem einfachen Oder mit | würde trotzdem alles ausgewertet werden
Vielleicht habt ihr ja schon switch kennengelernt (falls nicht, kommt das sicher bald )
Damit kannst Du dann solche Verschachtelungen auch übersichtlicher machen
Java:
boolean istVokal = false;
switch( c )
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
istVokal = true;
break;
default:
istVokal = false;
break;
}
Der default-case wäre hier streng genommen überflüssig, wenn vor dem switch die Variable mit false initialisiert wurde!
Das break im default-case ist streng genommen auch überflüssig!
Der gerade Strich | ist ein bitweises Oder. Durch 'a' | 'e' wird also das bitweise Oder auf die beiden Operanden 'a' und 'e' angewandt. Da beide Operanden nur Zahlen sind (ASCII), ist das Ergebnis auch wieder eine Zahl. Zum Schluss vergleichst du also eine Zahl c via == mit einer anderen Zahl.
Weiter als if (c == 'a' | c == 'e' | c == 'i') kannst du es nicht vereinfachen. Allerdings solltest du anstatt | besser || benutzen, dass ist ein Kurzschlussoperator. Angenommen c sei wirklich 'a', dann würde bei if(c=='a' || c=='e) der zweite Vergleich gar nicht ausgeführt werden, da ja schon der erste true liefert und somit das Oder bereits erfüllt ist. Bei dem einfachen Oder mit | würde trotzdem alles ausgewertet werden
Hallo InfectedBytes,
danke für deine superschnelle Antwort.
Leider bin ich so neu bei dem Ganzen, dass ich nicht ganz mitkomme. Darf ich nochmal zusammenfassen?
"|" ist also ein bitweises oder, ok. Wenn ich also die richtige Schreibweise benutze, also (c == 'a' | c == 'e' | c == 'i'), dann vergleicht mein "ODER" Wahrheitswerte miteinander, stimmt das? Z.B. c == 'a' wird du false und c == 'e' zu true. Wenn ich aber die falsche Schreibweise benutze, also (c == ('a' | 'e' | 'i' | 'o' | 'u')), dann vergleicht mein "ODER" Zahlen, weil 'a' für sich stehend vom ASCII in eine Zahl übersetzt werde? Stimmt das so? Und warum ist dann am Schluss auch "c" eine Zahl? "c" ist ja das, was ich im JOptionPane eingebe. Wird dieser Buchstabe dann sozusagen auch in eine Zahl übersetzt? Wenn ich aber zum Schluss eine Zahl "c" mit einer Zahl" 'a' | 'e'... vergleiche, dann kann das doch genauso gut funktionieren. Ich tippe im JOptionPane z.B. "a" ein. Das wird übersetzt zu irgendeiner Zahl. Die wird dann verglichen mit der Zahl 'a' die im If Statement steht. Das Resultat wäre true und es müsste funktionieren. Wie du siehst, ich kenne mich nicht aus.
PS: Danke Klaus, das ist tatsächlich das nächste Kapitel
Und warum funktioniert der Vergleich dann nicht?
aus if ( c == ('a' | 'e')) wird dann doch (wenn ich zum Beispiel den Buchstaben a eintippe:
if (97 == (97 | 101)) und das stimmt ja.
Aha ok, ich habe mir was durchgelesen. Also mein Bitweiser Operator "|" macht aus dem Ausdruck ('a' | 'b') also (97 | 101) ein komplett neues Bit, das dann mit meinem char c verglichen wird und deswegen nicht zusammenpasst. Hab ich das so richtig verstanden?
Es kommt hier vlt. auch mehr auf den Operator an !!
Ein "==" (Vergleich auf Gleichheit) vergleicht das linke Argument <c> mit dem kompletten rechten Argument <'a' | 'e'>!
Und dieses ('a' oder 'e') liefert eben kein char !!