warum c for loop condition die Initialisierung akzeptiert

7

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

?     
Srini 11.09.2017, 16:44
quelle

6 Antworten

9

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.

    
Ray Toal 11.09.2017, 16:52
quelle
5

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

%Vor%

Dies erzeugt auch eine Endlosschleife, die Helloworld druckt.

    
Elliott Frisch 11.09.2017 17:07
quelle
4

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.

    
kay 11.09.2017 16:47
quelle
1

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 kann     
nagendra547 11.09.2017 16:52
quelle
0

Nun, 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%     
Nergal 11.09.2017 17:15
quelle
0

i=5 ergibt 5 ( int j=i=5; ist gültig und j == 5 ). 5 ist ein "wahrer" Wert gemäß C und C ++. Java und PHP erwarten als zweiten Parameter einer for-Schleife einen Booleschen Wert. C und C ++ akzeptieren ganze Zahlen.

    
log0 11.09.2017 16:52
quelle

Tags und Links