Ich möchte eine lokale Variable in den Klammern einer if-Anweisung deklarieren. Zum Beispiel.
%Vor%Was ich will ist, zu sehen, ob der Charakter der ist, den ich will. Um es allgemein zu sagen, ich möchte die Variable (char c) sowohl in der Zeile von if als auch vom Rumpf von if verwenden, aber nicht außerhalb von if .
Aber g ++ (GCC 4.8.1) sagt erwarteter primärer Ausdruck vor 'char' . Ich frage mich, ob es eine Möglichkeit gibt, das zu tun, weil ich sowas nicht möchte.
%Vor% Ich wusste nicht, wie man eine Variable erstellt und ihren Wert mit if
testet, bis ich einige der veröffentlichten Lösungen gesehen habe. Sie könnten jedoch switch
verwenden. Dadurch könnten Sie auf zusätzliche Werte reagieren (vielleicht EOF
):
Sie könnten die if
-Anweisung immer in eine Inline-Funktion einfügen, und der Code sieht etwas sauberer aus. Wenn Sie den Quellcode direkt an diesem Ort haben möchten, aber ohne einen neuen Bereich um ein if
mit einer neuen Variable zu erstellen, wäre vielleicht ein Lambda für Sie akzeptabel.
Da Sie nur mit einem Wert vergleichen, benötigt Ihr spezielles Problem überhaupt keine Variable. Sie können also einfach Folgendes tun:
%Vor% Wenn Sie mit einer Reihe von Werten vergleichen möchten, ist der switch
Vorschlag die bessere Option.
Jerry Coffins Lösung sieht ansprechend aus, aber es läuft wirklich auf:
%Vor% Dies ist wahrscheinlich nicht das, was Sie wirklich wollten, da es nicht gut verallgemeinert wird, wenn Sie mit einem anderen Wert als 0x01
vergleichen möchten.
Potatoswatters Lösung scheint näher an dem zu liegen, was Sie wollen, aber vielleicht wäre es schöner, den Typ in eine eigenständige Klasse zu ziehen:
%Vor% Sie können die Variable in der if
-Anweisung einfach definieren. Zum Beispiel sollte dies kompilieren:
Das Problem ist, dass der Typ (z. B. int
) sofort nach der öffnenden Klammer folgen muss. Die zusätzliche Klammer, die Sie haben, bewirkt, dass die Kompilierung fehlschlägt. Also, wenn Sie das wirklich wollen, müssen Sie ein wenig clever werden und so etwas verwenden:
Damit können Sie die Erstellung und Initialisierung von ch
done, then nachdem der Teil des Ausdrucks abgeschlossen ist, in die Klammern um ch=getchar()
bringen, um den Vorrang der Zuweisung zu überschreiben Vergleich ..
Beachten Sie, dass &&
und ||
eine Kurzschlussauswertung durchführen, daher müssen Sie bei der Initialisierung vorsichtig sein. Sie können entweder:
... oder:
%Vor% ... aber wenn Sie versuchen, if (ch = 1 || ...
oder if (ch = 0 && ...
zu verwenden, wird durch die Kurzschlussauswertung der rechte Operand (der Teil, der Ihnen wirklich wichtig ist) überhaupt nicht ausgewertet.
Jetzt der Vorbehalt: Während ich einigermaßen sicher bin, dass dieser Code den Anforderungen des Standards entspricht und die meisten (alle?) aktuellen Compiler ihn akzeptieren, wird er wahrscheinlich die meisten Programmierer dazu bringen, den Code zu lesen Habe ich gemacht, und warum. Ich würde (im besten Fall) sehr zögern, diese "Technik" in echtem Code zu verwenden.
Edit: Es wurde darauf hingewiesen, dass das Ergebnis davon noch irreführender sein könnte, als einige ursprünglich erwarten, also werde ich versuchen, die Situation zu klären. Was passiert, ist, dass ein Wert von der Eingabe gelesen wird. Dieser Wert wird ch
zugewiesen und mit 0x1
verglichen. So weit, ist es gut. Danach wird das Ergebnis des Vergleichs (umgewandelt in eine Ganzzahl, also entweder 0
oder 1
) ch
zugewiesen. Ich glaube, es hat genügend Sequenzpunkte, dass das Ergebnis ein definiertes Verhalten ist. Aber es ist wahrscheinlich nicht das, was Sie oder irgendjemand wollen - also der Ratschlag, den Sie wahrscheinlich nicht verwenden wollen, und die Erwähnung, dass es wahrscheinlich die meisten Programmierer am Kopf kratzen lassen würde, sich zu fragen, was Sie zu tun versuchten. In dem sehr speziellen Fall des Vergleichs mit 0x1 ist der Wert von ch
in der if
-Anweisung 1
, aber es ist mehr oder weniger ein Zufall. Wenn Sie mit 0x2 vergleichen würden, wäre der Wert von ch
in if
immer noch 1
, nicht 2
.