Problem mit logischen Operatorenh
-
Hallo zusammen,
ich habe momentan ein kleinen Problem mit logischen Operatoren. Ich gebe über ein Edit Fenster einen String ein und möchte nun mittels einer If Abfrage diese überprüfen. Leider funktioniert es nicht, d.h. das "ODER" funzt nicht. Hier der QUelltext:if (modus == "HO" || "HA") Application->MessageBoxA("Sie haben ein ungültiges Modell eingegeben!","Fehler",0+16);
Wenn ich beispielsweise "Hallo" eingebe, passiert einfach nichts, erscheintnicht die MessageBox. Ebenfalls das funktioniertnicht:
if ((A || B || C) <= 0) { }
Ich bin mir nicht sicher, ob die KLammern etwas nützen. Ohne diese kommt jedoch das gleiche Ergebnis. Liegt es an der Syntax
oder wo liegt der Fehler??Vielen Dank für eure Hilfe
lg, freakC++
-
Hey,
poste doch mal ein wenig mehr von Deinem Quelltext.
Ich frage mich gerade zum Beispiel, was ist denn "modus"?
Ein AnsiString, in den Du den Text des Editfensters kopiert hast?Wenn ich das richtig sehe, willst Du eine Messagebox, wenn etwas anderes als H0 und HA eingegeben worden ist:
if( (Edit1->Text != "H0") && (Edit1->Text != "HA") ) MessageBox(NULL, "Sie haben ein ungültiges Modell eingegeben!","Fehler",MB_OK);
-
== hat eine höhere Priorität als ||
siehe auch: http://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorit%C3%A4t
-
Hallo zusammen,
also ich kann nicht mehr QUelltext dazuschreiben, weil es nicht mehr gibt. Das war nur ein Beispiel. Die Variable modus ist ein String.@ W.Stecher:
So könnte man es natürlich auch machen, aber wenn ich es mit ODER machen möchte müsste es doch eigentlich so heißen:if( (Edit1->Text == "H0")|| (Edit1->Text == "HA") ) MessageBox(NULL, "Sie haben ein ungültiges Modell eingegeben!","Fehler",MB_OK);
Warum kann ich jetzt nicht modus=="HO" schreiben, sondern mnuss das mit dem Edit1 machen???
@chewy: Also ich muss ehrlich gestehen, dass ich von der Prioritätenliste noch nie etwas gehört habe! Kannst mir sagen, um es es da geht und wie es auf mein Beipsiel übertragbar ist? Vielleciht liegt da ja das Problem!!
Vielen Dank für eure Hilfe
lg, freakC++
-
wenn in einer Anweisung mehrere Operatoren verwendet werden, dann wird anhand der geposteten Liste die Reihenfolge bestimmt, in der die verschiedenen Operationen ausgeführt werden. Einfaches Beispiel aus der Mathematik, Punkt vor Strich. Punktoperatoren haben eine höhere Priorität als Strichoperatoren:
7 + 5 * 2 = 17
d.h. 5 * 2 = 10, dann 10 + 7 = 17
und nicht 7 + 5 = 12, dann 12 * 2 = 24.Mit Klammern
(7 + 5) * 2 = 24
Weil die Klammern eine höhere Priorität als die Punktoperation besitzen, wird dieser Teil zuerst ausgeführt. 7 + 5 = 12, dann die Punktoperation 12 * 2 = 24. Diese Regeln gilt in der Programmierung ebenfalls, einfach mit (teilweise) anderen Symbolen.
Zu deiner Codezeile.
if(modus == "HO" || "HA")
Da der "gleich" Operator ( == ) eine höhere Priorität als das "logische oder" ( || ) hat, wird zuerst
modus == "H0"
ausgewertet. Das Ergebnis hängt sehr stark vom Inhalt von modus ab, ist der Inhalt von modus "H0", dann ist die Bedingung wahr, sonst falsch.
Der nächste Arbeitsschritt:
(wahr oder falsch, je nach Inhalt von modus) || "HA"
Die "logische oder" Operation ist immer wahr, wenn mindestens eine Seite wahr ist
true || false => true false || true => true true || true => true false || false => false
Nun wird geschaut, ob eine der beiden Seiten der "logischen oder" Operation wahr ist. Wahr ist eine Seite, wenn sie true bzw ungleich 0 ist. Die rechte Seite mit dem String "HA" ist ungleich 0 und dadurch immer wahr.
Deine IF Bedingung ist immer wahr und die MessageBox sollte eigentlich in jedem Fall erscheinen, ganz egal was in deinem String modus steht.
-
hey,
vielen Dank für die ausführliche Erklärung. Das hat mir echt geholfen. Also habe ich einen ganz falschen Ansatz?? Sollte ich den Vorschlag von W.Stecher umsetzen?Vielen Dank
lg, freakC++
-
Hallo
Ja W.Stecher hat gezeigt wie es richtig ist.
bis bald
akari