Probleme bei Definition in Abfrage: if(int i=f())
-
Hallo!
Folgendes Code Fragment:
if(int sel=Choice1->GetSelection()!=wxNOT_FOUND) {...}Das speichert mir in der Variable sel immer 1 wenn true, sprich: es wird gespeichert, ob der Vergleich true oder false zurückgibt.
Das ist ja nicht ganz das was ich möchte. Ich möchte in sel drinnen stehen haben, welchen Wert GetSelection() mir zurückgibt.Klammerung wäre das naheliegendste gewesen - funktioniert aber nicht da der Compiler dann wegen "expected primary-expression before ‘int’" schreit.
if((int sel=Choice1->GetSelection())!=wxNOT_FOUND)Ich verstehs nicht. Es kann ja nicht Sinn der Sache sein, das Ergebnis in sel zu speichern, denn das weiß ich aufgrund der Verzweigung in if oder else sowieso. Ich möchte einfach nur den Wert von GetSelection in sel drinnen haben und die Variable sel so lokal wie möglich haben.
Irgendwelche Ideen?
-
expected primary-expression before ‘int
Alle Klammern geschlossen?
Das ist ja nicht ganz das was ich möchte. Ich möchte in sel drinnen stehen haben, welchen Wert GetSelection() mir zurückgibt.
....
Es kann ja nicht Sinn der Sache sein, das Ergebnis in sel zu speichern, denn das weiß ich aufgrund der Verzweigung in if oder else sowieso.
..
Ich verstehs nicht. Es kann ja nicht Sinn der Sache sein, das Ergebnis in sel zu speichern, denn das weiß ich aufgrund der Verzweigung in if oder else sowieso. Ich möchte einfach nur den Wert von GetSelection in sel drinnen haben und die Variable sel so lokal wie möglich haben.Also benötigst du sel später noch?Ich verstehe nicht, ob du sel nun innerhalb der if-Schleife benötigst oder nicht.
Und wenn aus welchem Grund sollte es nötig sein?
Falls nicht, dann sollte es so reichen.
if(Choice1->GetSelection()!= wxNOT_FOUND) {...}
-
Mach Klammern um die Zuweisung.
if((sel=Choice1->GetSelection())!=wxNOT_FOUND) {...}Edit: Oh, nicht weit genug gelesen ...
-
So:
{ int sel; //so lokal wie möglich, deshalb in einem extra Scope if((sel=Choice1->GetSelection())!=wxNOT_FOUND) {...} }
-
Belli schrieb:
So:
{ int sel; //so lokal wie möglich, deshalb in einem extra Scope if((sel=Choice1->GetSelection())!=wxNOT_FOUND) {...} }Ich würde gleich
{ int sel = Choice1->GetSelection(); if(sel != wxNOT_FOUND) {...} }schreiben, ist doch viel besser erkennbar.
-
Ok na dann ist es natürlich auch kein problem wenn ich int sel bereits vor der if abfrage definiere.
Hab halt gelesen dass man in c++ dass auch innerhalb von if(...) machen kann und das wäre in dem fall ideal gewesen, da ich die variable sel genau 2mal brauche: Einmal für den vergleich if(...) und das zweite mal im scope direkt nach dem if () {...}.Sinn sehe ich aber wirklich keinen, wenn in der variable dann eh nur true/false gespeichert werden kann. Was hat sich mr. stroustrup denn dabei gedacht?
-
wieso "dabei gedacht hat"?
Wenn ich das mit meine begrenzten Verständnis richtig sehe, dann wird der Variablen sel das Ergebnis des Vergleiches Choice1->GetSelection())!=wxNOT_FOUND zugewiesen, was entweder true oder false ergibt, oder? Werden Ausdrücke solcher Art nicht in der Regel von rechts nach links ausgewertet?Nebenbei finde ich solche Konstrukte schauderhaft und das von Hacker gepostete Beispiel ist imho sehr viel einfacher nachzuvollziehen.
-
if nix geht schrieb:
Hab halt gelesen dass man in c++ dass auch innerhalb von if(...) machen kann und das wäre in dem fall ideal gewesen, da ich die variable sel genau 2mal brauche:
Das ist auch richtig so, aber die Kleinigkeit mit schweren Folgen, die hier fehlt ist: Man kann eines von beidem haben, einen Ausdruck (Expression, d.h. eine logische Aussage) oder eine Deklaration, nicht beides gleichzeitig. Da es keine Möglichkeit gibt, das eine in das andere umzubiegen, muss man sich entscheiden, was man wirklich in der Abfrage braucht und das jeweils andere über die hier schon gezeigten (nicht sehr aufwändigen) Workarounds erreichen.
Sinn sehe ich aber wirklich keinen, wenn in der variable dann eh nur true/false gespeichert werden kann. Was hat sich mr. stroustrup denn dabei gedacht?
Es kann nicht nur true und flase gespeichert werden. Auf diese Weise kann man zum Beispiel prüfen, ob ein int-Funktionsrückgabewert nicht 0 ist und mit diesem dann weiterarbeiten. Ist vermutlich eher etwas für C-Bibliotheken, wo dies für Fehlercodes oft in dieser Art gemacht wird. Überhaupt sieht man Deklarationen in if-Bedingungen so gut wie nie. Es ist zwar recht intuitiv klar, was passiert, aber im Zweifelsfall ist es einfach nur unlesbarer, da ungewöhnlich.
-
ok jetzt ists mir klar, danke!