IF (Anweisung1 ODER Anweisung2)... Versteh's nich
-
Tach,
Ich hab kurz was geschrieben:
#include <stdio.h> char Auswahl = ' '; int main () { printf("<J/N>?\n\n"); scanf("%c", &Auswahl); if (Auswahl == 'J' | 'j' ) { printf("\nSie haben JA gewaehlt!\n\n"); } else if (Auswahl == 'N' | 'n') { printf("\nSie haben NEIN gewaehlt!\n\n"); } //system("PAUSE"); return 0; }
müsste eigentlich ersichtlich sein, was ich damit will, doch es klappt nicht sobald ich bei der IF Anweisung das | -> ODER hinzufüge...
In diesem Code jetzt wird immer "Sie haben JA gewaehlt" angezeigt (Egal ob ich J,j,N oder n eingebe) Was kann ich tun=?MfG
-
if(Auswahl == 'J' || Auswahl == 'j')
| ist Bitweise-Oder und || ist ein logisches-Oder.
-
Danke Rüdiger, klappt nun bestens!
Dennoch würde es mich interessieren, wann jetzt | bzw. || vorkommt (Unterschied zwischen bitweise und logisch)
//Bin ganz neu im ProgrammierenMfG
-
Ich frage mich langsam ehrlich, woher diese "foo == a | b"-Geschichte kommt. Hat da jemand ein Anfängerbuch geschrieben, der es besser hätte sein lassen sollen? Ich kucke da in Ihre Richtung, Herr Jürgen Wolf!
Wie dem auch sei, binäres Oder verodert quasi korrespondierende Bits zweier Integer miteinander. Beispiel: Sei a = 6 und b = 10, dann ergibt sich für a | b Folgendes:
Binärdarstellung: a = 6 = 0110 b = 10 = 1010 a | b = 14 = 1110
(Binärdarstellung abgekürzt). Dagegen ist logisches Oder eine Verkettung boolscher Werte (d.h. wahr/falsch), die wieder einen boolschen Wert ergibt. Jetzt ist es in C so, dass 0 boolsch als falsch gewertet wird, während alles andere als wahr verstanden wird. Umgekehrt wird falsch zu 0 konvertiert und wahr zu 1. Also:
if(2) { /* wird betreten */ } if(0) { /* wird nicht betreten */ } int x = 0 == 0; /* x ist jetzt 1 (bzw. wahr) */ int y = 0 == 1; /* y ist jetzt 0 (bzw. falsch) */
Und dementsprechend
int x = 2 || 3; /* x ist jetzt 1 (bzw. wahr) */ int y = 0 || 5; /* y ist jetzt 1 (bzw. wahr) */ int z = 0 || 0; /* z ist jetzt 0 (bzw. falsch) */
-
Nebenbei gibt es noch die Rangfolge der Operatoren.
Am bekanntesten sollte Punkt- vor Strichrechnung sein.
Z.B.: kommt == vor |Bei dir wurde also erst der Vergleich mit 'J' gemacht, das Ergebnis dann bitweise mit 'j' verodert. Dadurch ist das Ergebnis immer ungleich Null und daher wahr.
Alternativ kann man auch tolower() oder toupper() aus <ctype.h> benutzen.
Diese wandeln das übergeben Zeichen (kein String) in Klein-/Großbuchstaben um.
Dies funktioniert aber nicht bei Umlauten!#include <ctype.h> ... if (tolower(Auswahl) == 'j' ) { ... }
-
DirkB schrieb:
#include <ctype.h> ... if (tolower(Auswahl) == 'j' ) { ... }
Wobei das zufällig wieder geschrieben werden kann als
if ( 'j' == ( Auswahl | 32 ) )
-
volkard schrieb:
Wobei das zufällig wieder geschrieben werden kann als
if ( 'j' == ( Auswahl | 32 ) )
Das werden die Jungs von IBM aber anders sehen. :p