In einem Lehrbuch, in dem ich nach einer Klasse gesucht habe, heißt es, dass eine Anweisung leer sein kann (die Null-Anweisung). Die Null-Anweisung ist nur als Semikolon definiert.
Es macht absolut nichts zur Ausführungszeit. Die Null-Anweisung wird selten verwendet.
Als mäßig erfahrener Programmierer finde ich es interessant, dass sie sagen , dass sie selten verwendet werden. Dies impliziert, dass es irgendwo eine Verwendung dafür gibt.
Was könnte eine solche Aussage möglicherweise gebrauchen?
Sie können es verwenden, wenn eine Anweisung syntaktisch, aber nicht semantisch erforderlich ist. Der häufigste Fall ist, einen der Teile einer for-Schleife wegzulassen, wie in diesem Beispiel , obwohl die meisten Leute diese Verwendung als seltsam und schwer lesbar empfinden. Wie Ihr Buch sagt, wird es selten verwendet.
quelle
while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }
natürlich alle in getrennten Zeilen. Ich hätte es so schreiben könnenwhile ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }
, aber das wäre falsch.void method(){ //code here. If(condition){return ;}}
.Ich bevorzuge die Verwendung einer while-Schleife , aber mit einem Null-Ausdruck können Sie Folgendes schreiben:
Mit einer Null-Anweisung können Sie jedoch Folgendes schreiben:
Der Hauptzweck davon ist es, die Zeit des armen Wartungsprogrammierers zu verschwenden, der nach Ihnen kommt und sich fragt, warum der Thread nicht läuft. Eine Aussage muss eine Weile folgen. Ein einsamer; ist eine Aussage. Dieser Anweisungsblock ist also nicht Teil der Schleife.
Das heißt nicht, dass es keine guten Verwendungszwecke gibt. Sie sind nur selten. Sie sehen normalerweise so aus:
Weil es so aussieht, als ob Sie das vorhaben (auch das reicht manchmal nicht aus).
In der Assembly wird diese Null-Anweisung als NOP bezeichnet . In Python heißt es Pass . In Java (und den anderen Kindern von c) ist es ein Semikolon, wie Sie gesagt haben, oder sogar wahr zu behaupten;
Ich kenne einige Verwendungszwecke:
Semantik .
Es gibt einen Unterschied zwischen einem leeren Raum und dem Setzen einer Null als Antwort. Es steht klar, nein, ich habe nicht vergessen, hier etwas zu platzieren. Dieses Nichts soll nichts sein. Es ist explizit nichts. Dieser Raum wurde absichtlich leer gelassen. Auf diese Weise erhalten wir N / A zum Kompilieren.
Das Nullmuster
Stellen Sie sich eine komplizierte und teure Lichtsignalmaschine vor, die wiederholt eine farbige Glühbirne von einem Förderband aufnahm, sie in eine Fassung schraubte, einschaltete, entfernte und die nächste aufnahm. Sie können steuern, was dieses Ding durch die Farbe der Glühbirnen signalisiert, die Sie auf den Gürtel gelegt haben. Großartig, jetzt, da es endlich einwandfrei funktioniert, möchte Ihr Chef, dass Sie einen Weg finden, um das Timing dieser Signale zu steuern. Er möchte eine Lücke zwischen Nachrichten hinzufügen. Sie erinnern sich mit Entsetzen daran, dass sich viele Teile um das Timing dieser Signale kümmern und wie schmerzhaft es war, sie synchron zu halten. Wie können Sie das Timing kontrollieren, ohne dass Sie über das Wochenende bei der Arbeit bleiben? Sie schauen zu einem Behälter mit ausgebrannten Glühbirnen und bekommen eine, nicht wörtlich, gute Idee.
Manchmal möchten Sie Polymorphismus verwenden, um einfach etwas auszuschalten, ohne etwas zu beschädigen.
Debuggen
Wenn Sie einen Haltepunkt festlegen, muss ein Platz für den Haltepunkt vorhanden sein. Nun sicher, einige Debugger lassen Sie es auf die schließende geschweifte Klammer setzen, aber wenn sie es nicht tun, ist es schön, dass die Sprache Sie zwingen lässt, dass es einen Platz gibt, an dem Sie einen platzieren können, selbst wenn dieser Ort nichts tut.
Nicht wirklich eine Java-Sache, aber es gibt auch:
Binäres Geigen
Assemblies Der NOP-Befehl ermöglicht das Fummeln mit der kompilierten ausführbaren Binärdatei. Aber moderne Java-Compiler optimieren so viel, dass ich nicht sicher bin, ob das Semikolon nicht nur schlecht ist. Früher haben wir diese leeren Stellen in der ausführbaren Datei aber auch verwendet, um das Timing zu steuern oder um später einen Haken zu setzen. Ohne das NOP gäbe es dort tatsächliche Anweisungen. Wenn Sie also einbinden möchten, müssen Sie diese Anweisungen an eine andere Stelle kopieren, um Platz für den Haken zu schaffen. Dies funktioniert genauso gut in der c-Sprache, aus der Java einen Großteil seiner Syntax bezieht. Aber ich glaube nicht, dass dieses Hook-Fiddling in Java häufig vorkommt. Dazu verwenden wir die aspektorientierte Programmierung .
quelle
for
ist keine Null-Anweisung. Nullanweisungen (auch leere Anweisungen genannt) können an derselben Stelleif
auftreten, an der andere Anweisungen (wie eine ) auftreten können. Die folgenden Klammernfor
erlauben jedoch keine Anweisungen zwischen den Semikolons, sondern nur einen Initialisierer und zwei Ausdrücke, die optional sind. Es ist also eine andere Verwendung von Semikolon als als Statment-Terminator. Eine leere Aussage wäre das letzte Semikolon infor(;;);
Ich benutze es, weil Java so gestaltet ist, dass es nicht mit der menschlichen Sprache übereinstimmt. Gleiches gilt für C.
Eine Aussage ist
statement;
.Eine if-then-else-Anweisung lautet
if (condition) statement; else statement;
Eine if-then-else-Anweisung mit zusammengesetzten Blöcken lautet
if (condition) {statements} else {statements}
Das ist eindeutig Unsinn.
Ich schreibe dementsprechend,
if (condition) {statements} else {statements};
was logisch und vernünftig ist.Wenn die Entwickler von Java dies als Wenn-Dann-Sonst gefolgt von einer Null-Anweisung behandeln möchten, bin ich damit einverstanden. Wenn es sie glücklich macht, lass es sie glücklich machen.
quelle
if (condition) {statements;} else {statements;}
. Außerdem ist Java ziemlich konsistent, wenn es darum geht, kein;
s danach zu benötigen}
. So ähnlich wie menschliche Sprachen nicht oft einen Punkt am Ende eines Satzes einfügen, der bereits mit einem Fragezeichen abgeschlossen ist. (Sicher, es gibt die!?
oder?!
Endungen, aber das sind nur Annäherungen an‽
den Interrobang-Charakter .)