Ich habe folgenden Code gefunden:
int func_prim (int zahl) {
int count;
if (zahl < 0)
return -1;
for (count = 2; zahl % count != 0 && zahl >= count; count++);
if (count == zahl)
return 1;
return 0;
}
Der Funktionspunkt besteht darin, zu überprüfen, ob eine Zahl eine Primzahl ist oder nicht.
Ich verstehe nicht, warum die for-Schleife ;
am Ende hat:
v
for (count = 2; zahl % count != 0 && zahl >= count; count++);
Ohne das funktioniert der Code nicht richtig.
Was ist die Erklärung?
{ }
, kann anstelle von;
dokumentiert werden, dass die Schleife einen leeren Körper haben soll und keine der nachfolgenden Zeilen enthält.for (...) continue;
.for
Loop-Ansatz bevorzugen : Schließlich gibt es eine Initialisierung, eine Stoppbedingung und eine Iteration, die natürlich durch dasfor
Konstrukt ausgedrückt wird . Sie sind anderer Meinung, aber ich bin sicher, der Autor weiß, was einewhile
Schleife ist. Übrigens, deshalb brauchen Sie Codierungskonventionen in einem Team.Antworten:
Es bedeutet genau das Gleiche wie:
for(count = 2; zahl % count != 0 && zahl >= count; count++) { }
quelle
{}
in einer einzelnen Zeile möglicherweise ein visuell einfacherer Hinweis auf einen leeren Körper ist). Ohne Legacy-Code wäre die Sprache ohne die;
Regel für leere Anweisungen besser geeignet . Das;
, was danach obligatorischdo ... while(...)
ist, ist auch dumm, aber zumindest dort habe ich eine kluge Verwendung davon gesehen.;
besser lesbar. Der leere Block sieht aus wie ein Unfall, als hätte der Programmierer einfach vergessen, den Körper auszufüllen. Die leere Aussage macht seine Absichten klar.for (...) { /* empty block */ }
klarer als beide, soweit dies zeigt, dass es beabsichtigt ist.C
Programmierer, aber warum um alles in der Welt sollte dies jemals nützlich sein?( )
; Der Punkt dieser Schleife ist escount
, einen bestimmten Wert zu haben, der aufzahl
Eine for-Schleife hat das
for
Schlüsselwort, gefolgt von Klammern mit drei optionalen Ausdrücken, die durch Semikolons getrennt sind, gefolgt von einem Textkörper, der in jeder Iteration der Schleife ausgeführt wird.Das Ziel der for-Schleife in Ihrem Beispiel besteht darin, den Wert von
count
festzulegen, mit demzahl
in der folgenden if-Anweisung verglichen wird . Dies wird in den durch Semikolons getrennten Ausdrücken erreicht, sodass der Schleifenkörper nichts tun muss.Da die Schleife nichts tun muss, verwendet sie die leere Anweisung als Hauptteil.
Wenn das
;
am Ende weggelassen würde und keine anderen Änderungen vorgenommen würden, würde die if-Anweisung nach der for-Schleife selbst zum Hauptteil der for-Schleife. (Das ist nicht beabsichtigt und würde das Programm brechen, wie Sie beobachtet haben.)Es
;
ist jedoch nicht die einzige Möglichkeit, einen leeren Schleifenkörper zu schreiben, und es ist wahrscheinlich auch nicht die sinnvollste Möglichkeit , einen eigenen Schleifenkörper aus einer einzelnen Zeile in derselben Zeile zu machen. Es funktioniert einwandfrei, aber das Problem ist, dass andere Leser - und vielleicht derselbe Programmierer, der später zum Projekt zurückkehrt - sich fragen, ob es tatsächlich ein Fehler war. Schließlich gibt man beim Codieren in einer Sprache im C-Stil häufig Semikolons an den Zeilenenden ein, sodass es einfach ist, ein zusätzliches Semikolon einzugeben, wenn es nicht dazu gehört.Das andere Problem ist , dass im Code , in dem eine einzeilige Schleife mit
;
als sein Körper ist der gewählte Stil, ist es schwer zu erkennen , wenn jemand tatsächlich hat den Fehler , Putting a gemacht ,;
wenn man nicht gehört.Daher können diese Alternativen vorzuziehen sein:
;
eingerückte Zeichen in die nächste Zeile - wie sh1 vorschlägt{ }
und nicht als leere Anweisungcontinue;
Anweisung, die einfach bewirkt, dass die Schleife zur nächsten Iteration übergeht (was dasselbe ist, was passiert, wenn der Schleifenkörper leer ist) - auch wie sh1 vorschlägtquelle
;
und dem zustimmen kann{}
, würde ich dascontinue;
extrem seltsam finden. Es würde für mich so aussehen, als hätte jemandcontinue
eine äußere Schleife oder so erwartet . Auf jeden Fall ein WTF-Moment, und Sie möchten diese im Code vermeiden. Ich würde sagen,{}
erfasst die Absicht auf die am besten lesbare Weise.for (...) /* do nothing */ ;
, um deutlich zu machen, dass dies beabsichtigt ist.for(count=2; zahl % count != 0 && zahl >= count;) ++count;
for
Schleife wird per Definition gezählt. Das Exportieren des Inkrementors aus der Schleife gibt Ihnen keinen Grund,for
vswhile
zu verwenden.int count = 2; while( zahl % count && zahl >= count ) ++count;
sowiesoDas Semikolon am Ende der for-Schleife bedeutet, dass es keinen Körper hat. Ohne dieses Semikolon glaubt C, dass die
if
Anweisung der Hauptteil der for-Schleife ist.quelle
;
. Ein Einzelner;
ist praktisch (wenn nicht tatsächlich) an jedem Ort gültig, an dem eine Anweisung zulässig ist, da ein Einzelgänger eine Nullanweisung;
ist (was eine Anweisung ist).Die Syntax der
for
Schleife ( Iterationsanweisung ) lautetfor ( clause-1 ; expression-2 ; expression-3 ) statement
statement
kann eine Null-Anweisung sein (;
). C11 6.8.3 sagtIn Absatz 5 gibt es ein Beispiel
Das Gleiche passiert in
for (count = 2; zahl % count != 0 && zahl >= count; count++);
;
wird verwendet, um derfor
Anweisung einen leeren Schleifenkörper bereitzustellen. Ohne;
die Anweisung neben derfor
Schleife wird als ihr Körper betrachtet und ausgeführt.quelle
;
am Ende?" . Es geht nicht darum, "ob es eine gute Übung ist oder nicht?" .Zusätzlich zu dem, was die anderen ausgezeichneten Antworten bereits sagen, möchte ich darauf hinweisen
for(count=2; zahl % count != 0 && zahl >= count; count++);
(dh eine
for
Schleife mit einer leeren Anweisung, die zum Inkrementieren eines "Zählers" verwendet wird) entsprichtcount=2; while(zahl % count != 0 && zahl >= count) { count++; }
Dies würde das Ziel des Codes noch klarer machen als einige der aufgeführten Alternativen: Wenn keine Kommentare vorhanden sind, wie im vorliegenden Fall, könnte eine Schleife mit einer leeren Anweisung einen anderen Programmierer verwirren, der den Code beibehalten oder verwenden muss (wie er war) der Fall mit dem OP hier).
Der Kontext kann helfen, den wahren Umfang der Anweisung zu erkennen, aber zwischen einer
for
Schleife mit einer leeren Anweisung und einerwhile
Schleife mit einer Anweisung erfordert letztere weniger Arbeit, um ihren Umfang zu verstehen.quelle
count
in einem größeren Umfang deklariert wird.count
wird in beiden Versionen am Anfang der Funktion deklariert.count
den richtigen Wert zu erhalten, damit sie weiter verwendet werden kann,count
muss sie in einem größeren Umfang vorhanden sein, damit dies überhaupt funktioniert und deshalb ist es genau gleichwertig. (Es ist jedoch immer noch ein hässlicher Missbrauch einerfor
Schleife, und Federico hat Recht, dass dies der richtige Weg ist, um die Semantik auszudrücken.)Das
;
Nach derfor
Schleife bedeutet einfach, dass diefor
Schleife nichts weiter tut, als den Zähler zu erhöhencount
.quelle
for
Aussage :Null-Anweisung :
In Ihrem Fall
;
ist dies die Null-Anweisung derfor
Anweisung :int func_prim (int zahl) { int count; if (zahl < 0) return -1; for (count = 2; zahl % count != 0 && zahl >= count; count++) ; if (count == zahl) return 1; return 0; }
Ohne sie wird das
if
zur for-Anweisung:int func_prim (int zahl) { int count; if (zahl < 0) return -1; for (count = 2; zahl % count != 0 && zahl >= count; count++) if (count == zahl) return 1; return 0; }
Daher anders verhalten.
quelle
Die for-Schleife dient nur dazu, den Wert von zu erhöhen
count
.quelle
Eine
for
Schleife hat (normalerweise) einen Körper.wo der Körper in Klammern eingeschlossen ist
{
}
Für einen einzelnen Anweisungshauptteil sind die geschweiften Klammern jedoch optional.
;
ist eine leere Aussage.Der obige Kombinieren es wird offensichtlich , dass die
for
Schleife ausführt , bis die Bedingung wirdfalse
.quelle
Die for-Schleife durchläuft im Grunde alle Zahlen, die kleiner oder gleich,
zahl
aber größer als 2 sind, und speichert sie in der Variablencount
. Während es all diese Zahlen durchläuft, prüft es, obzahl
es durch teilbar istcount
. Wennzahl
durch teilbar istcount
, wird die Schleife gestoppt. Andernfalls wird die Schleife gestoppt, wenn siecount
gleich istzahl
.Die if-Anweisung nach der for-Schleife prüft, ob
count
gleich istzahl
. Wennzahl
dies der Fallzahl
ist , muss dies bedeuten, dass die Schleife alle Zahlen kleiner und größer als 2 durchlaufen hat . Dies bedeutet, dass sie durch alle Zahlen kleiner als sie selbst und größer 2 teilbar ist, waszahl
Primzahlen ergibt .quelle
Es gibt die Anweisung an, für die die for-Schleife verwendet wird. Es kann nicht leer sein. Zumindest sollte es eine einzige Aussage enthalten. ;; ist die leere Anweisung, für die die Iteration durchgeführt wird.
quelle