Gestern habe ich ein Interview besucht, da habe ich ein komisches Programmschnipsel gesehen.
Beim ersten Blick entscheide ich, dass in Snippet ein Kompilierungsfehler enthalten ist. Aber als ich nach Hause kam und manuell im C-Compiler versuchte, fand ich heraus, dass ich total falsch lag
Siehe Interviewcode
%Vor%Ausgabe:
%Vor%Ausgabe in C ++ ist ähnlich wie C
Aber,
wenn wir diesen Code im Java-Compiler ausführen
%Vor%Ähnlich habe ich in PHP versucht, das gleiche Problem wie in Java. Warum C und C ++ diese Art von seltsamer Bedingung Anweisung in "For-Schleife" erlauben. Was ist der Grund dafür
?Sowohl in C als auch in Java ist die zweite Komponente der for-Schleife ein Ausdruck und Zuweisungen sind Ausdrücke. Deshalb können Sie (syntaktisch gesprochen) den Ausdruck
haben %Vor%als Schleifenbedingung in einer for-Schleife in beiden Sprachen.
Allerdings fügt Java im Gegensatz zu C die folgende Zeile hinzu zur statischen semantischen Definition der for-Schleife .
Der Ausdruck muss den Typ boolean oder Boolean haben oder es tritt ein Fehler bei der Kompilierung auf.
In Java der Typ des Ausdrucks
%Vor% ist int
, nicht boolean
, daher gibt der Java-Compiler den Fehler aus.
C hat diese Einschränkung nicht, da es bei Typen tendenziell viel permissiver ist, wobei Integer und Booleans mehr oder weniger "dasselbe" sind. Details sind vielleicht ein wenig technisch, aber die ganze Zahl 5 wird implizit zur Wahrheit gezwungen, so dass Sie eine Endlosschleife sehen.
false
(in C) ist 0
. In C ist alles, was nicht 0
ist, true
. Java funktioniert nicht so (Java ist stark typisiert und lässt nicht zu, dass int
implizit in ein boolean
konvertiert wird). Also, das äquivalente Java, wäre etwas wie
Dies erzeugt auch eine Endlosschleife, die Helloworld druckt.
Weil Zuweisungen Ausdrücke in C sind, keine Anweisungen. Das ist für verschiedene Sprachen anders ...
Nb. Lesen Sie immer die Warnungen Ihres Compilers und verwenden Sie -Wall -Wextra -Werror -pedantic -pedantic-errors
, um solche Tippfehler zu vermeiden. Ihr void main()
wäre auch nicht bestanden worden, wenn Sie die Warnungen gelesen haben.
Wie Ray Toal in Java-Zuweisungen gezeigt hat, sind Ausdrücke auch Ausdrücke, aber Ganzzahlen werden nicht automatisch in boolesche Werte umgewandelt.
In Java, für FOR-Schleife
für (int i = 0; i = 5 ; i = 5)
Der markierte Code (mittlerer Zustand der for-Schleife) erwartet a Boolescher Typ. Sie können keinen Ausdruck angeben, der nicht als zurückgegeben wird Boolescher Wert.
Java ist eine robuste Sprache und alles ist stark typisiert. In C / C ++ ist die Zuweisung von i = 5 in Ordnung, da dieser Ausdruck in bool als true konvertiert wird. Der Java-Compiler wird den Fehler ausgeben, der nicht von int in boolean
konvertiert werden kannNun, lasst uns herausfinden, was der Code macht.
Sie haben:
%Vor%in C, für (int i = 0; i = 5; i = 5) jeder Teil der for-Schleife ist ein Ausdruck. Bitte denken Sie daran, dass for-Schleifen syntaktischer Zucker für while-Schleifen sind.
würde wahrscheinlich übersetzt werden und gleich sein wie ...
%Vor% Der Grund, warum Java darüber winselt, ist, dass Java stärker typisiert ist als C und C ++. In Java wird erwartet, dass der mittlere Ausdruck ein strikt bool
Wert / Ergebnis ist, damit er als gültiges Java betrachtet werden kann.
In C (++) sind boolesche Werte nichts als int-Werte (true == 1 und false == 0). Zuweisungen werden als Ausdruck betrachtet, der als wahr ausgewertet wird, wenn der Wert, den Sie einem Bezeichner geben, über oder kleiner als 0 ist.
Lassen Sie uns das in einem anderen Szenario verwenden!
%Vor%