Schreiben Sie ein Programm (die Größe spielt keine Rolle) und fügen Sie eine Zeile ein, die nutzlos aussieht, aber eigentlich nicht - wenn sie entfernt würde, würde das Programm abstürzen oder etwas falsch machen. Fühlen Sie sich frei, die Zeile zu markieren, die von einem Kommentar nicht verwendet wird, oder geben Sie Ihre Codebeschreibung an, wie im folgenden Beispiel (in diesem Beispiel ist die Zeile natürlich nicht erforderlich, sondern nur ein Beispiel).
int main(void) {
/* The line below is actually needed. */
2 + 2;
return 0;
}
Da dies ein Beliebtheitswettbewerb ist, gewinnt die Lösung mit der höchsten Stimmenzahl.
popularity-contest
underhanded
Konrad Borowski
quelle
quelle
Antworten:
C
Kompiliert nicht, wenn wir die Single entfernen
;
.EDIT :
Lösung unten:
quelle
C / C ++
Nur ein Code im Stil von Einführung / Tutorial geschrieben ...
Tutorial Nr. 2 : Zahlen einlesen, mathematische Operationen ausführen und Ergebnisse ausdrucken.
Das Entfernen der Zeile,
result = 42;
die auf den ersten Blick überflüssig und angesichts des angegebenen Ziels tatsächlich falsch aussieht, führt dazu, dass das Programm nicht das tut, was in der Beschreibung angegeben ist.Warum?
quelle
>!
statt mit nur starten>
.>!
einfach nicht in jeder zeile verwendet habe . Ich denke, sie werden mir nicht angezeigt, als ich sie schrieb. Interessanterweise verdirbt der SE-Parser es nicht :)"stdio.h"
anstelle des eigentlichen Library- Includes sah, etwas Hinterhältiges im Gange war<stdio.h>
Leerzeichen
Leider kann ich mein Programm hier nicht anzeigen, da StackExchange alle nachgestellten Leerzeichen entfernt. Das gleiche gilt für pastebin.com und pastie.org, daher kann ich auch keine Links dazu erstellen.
Natürlich sieht das gesamte Programm "nutzlos" aus, aber wenn Sie eine Zeile entfernen, ändert sich etwas.
quelle
JavaScript:
quelle
b
den Wert vonalert(a)
": Soll das nichtb+-
seinb+=
?b++
oderb--
.b + -2 + 2
. Wenn Sie die Zeile mit löschen2 + 2;
, wird dies zu ausgewertetb + -alert(a);
.C:
Wenn Sie die Zeile löschen,
i = i;
funktioniert der Code nicht. Das ist weil...quelle
APL
Hier ist eine APL-Funktion:
Es macht dasselbe wie Js Monade
i.
:Es kann ein optionales linkes Argument verwendet werden, das den Offset angibt:
Die Linie
⍺←⎕IO ⋄ ⎕IO←⍺
sieht nutzlos ( „assign⎕IO
zu⍺
, weisen Sie dann⍺
auf⎕IO
“), aber der erste Teil läuft nur , wenn keine linke Argument gegeben ist, so in der Tat ist es etwas tut:⍺
wird⍺
auf (global) gesetzt⎕IO
.⎕IO
auf⍺
quelle
C #
Die Variable
fibo
muss zugewiesen werden, bevor Sie sie in einem Lambda verwenden können, auch wenn Sie dieses Lambda sichfibo
selbst zuweisen . Wenn Sie die (scheinbar nutzlose) Zuweisung entfernen, tritt ein Compilerfehler auf („Verwendung der nicht zugewiesenen lokalen Variablen 'fibo'“).quelle
Windows Batch:
Stellen Sie das Programm ein und ändern Sie die Datei auf:
Wenn Sie den Kommentar entfernen oder seine Größe ändern, führt dies zu Problemen, da die erste Instanz des Programms angehalten wird und die Interpretation ab dem 19. Byte fortgesetzt wird.
quelle
Java
Es ist ein Arbeitsprogramm, das eine Webseite von einer URL abruft. Sie könnten überrascht sein, dass die Leitung
kompiliert ohne Warnung. Tatsächlich kompiliert das Programm ohne es nicht.
quelle
Rubin
Ein ähnliches Problem trat kürzlich bei der Arbeit auf - ein Mitarbeiter hat meine scheinbar unnötige Initialisierung während der Codeüberprüfung markiert, und ich war wirklich versucht, die Erklärung in einen Spoilerblock zu stecken. Also mache ich das hier.
Ausgabe wie sie ist:
Ausgabe mit entfernter erster Zeile der Methode:
quelle
match = Prime.find { |n| n.to_s[regexp] }
Prime.find
zurückn
(zB 223) undmatch
muss seinn.to_s[regexp]
(zB "22"). Offensichtlich habe ich mir das Problem ausgedacht, dies notwendig zu machen.find
aufPrime
und nicht ein Array. Wie auch immer, es ist immer noch ziemlich leicht zu bemerken, warum diese Leitung benötigt wird ...PHP
Hier,
\n//This is a comment
ist notwendig. Ohne das läuft der Code nicht.Zumindest ein
\n
Char ist erforderlichEOT;
, um es ordnungsgemäß auszuführenquelle
JAVASCRIPT
Ohne das Semikolon
a
würde dann auch immer der Rückgabewert aus der 2. Funktion werden - in diesem Fall ist esundefined
. Weil die ursprünglich zugewiesene Funktiona
sofort mit der zweiten Funktion als Argument ausgeführt wirdb
.quelle
COBOL (IBM Mainframe)
Wenn Sie das obige Programm ausführen (jedes IBM Mainframe COBOL seit COBOL II (erster IBM Compiler bis 1985, wahrscheinlich auch andere IBM COBOLs), lautet die Ausgabe:
Entfernen Sie jedoch die dreifach nutzlose Zeile "MOVE SPACE TO W-WHEN-COMPILED". (Das Feld hat einen Anfangswert für Leerzeichen, und in der nächsten Anweisung ist anderer Inhalt enthalten, und es wird trotzdem verzweigt.) Das Programm gibt keine Ausgabe aus und beendet (U4038) (dh es stürzt ab) mit der folgenden Meldung :
(Der Nachrichtencode und der Text variieren zwischen den Compilern. Die Offsets hängen vom tatsächlich verwendeten Compiler und den Kompilierungsoptionen ab. Die Adresse hängt davon ab, wo das Programm beim Ausführen geladen wird.)
Der Grund ist der
NEXT SENTENCE
. Das ist einSecret GO TO
. Der Compiler sucht den nächsten Punkt in der Quelle und generiert eine Verzweigung zur folgenden Anweisung. Ab COBOL II wurde die Verwendung von Punkt / Periode gelockert. Ein Programm muss mit einem Punkt enden. In diesem Fall befindet sich der Zweig außerhalb des Programmendes.Beide Programme kompilieren 100% sauber (keine Diagnosemeldungen, Return Code von Null).
Dieses Verhalten ist eine dumme "IBM-Erweiterung" für COBOL. Die 1985 Norm erlaubt es nicht ,
NEXT SENTENCE
innerhalbIF
/END-IF
(CONTINUE
anstelle verwendet wird, die ein no-op ist). IBM erlaubte es - und verursachte von Zeit zu Zeit schreckliche Fallstricke.quelle
quelle
blah
? Hier mit OpenBSD 5.5 / amd64 und dem System gcc gibt es keine Fehler, egal ob es vorhanden ist oder nichtblah
. Das kompilierte Programm weist 16 Bytes Stapelspeicherplatz zu und kopiert den 16-Bit-Wert "ok" in die ersten 2 Bytes. Das nicht initialisierte 3. Byte hat zum Glück '\ 0'. Wennblah
vorhanden, befindet es sich im 16. Byte und beendet die Zeichenfolge immer noch nicht.~ - ~!
Dies ist wahrscheinlich die dümmste und offensichtlichste hier.
Ohne diese zweite Zeile wird ein Fehler ausgegeben und damit gedruckt
y
.quelle
~-~!
Windows Batch
Dies ist eine Batch-Datei, die die Nummern 1 bis 10 mit jeweils einer leeren Zeile ausgibt:
Dies nutzt effektiv einen schmutzigen Hack , um eine neue Zeile in einer Variablen zu speichern (die Verwendung von verzögerten Erweiterungen beseitigt die gruseligere NL-Zeile in der verknüpften Antwort). Wenn Sie die zwei völlig unnützen leeren Zeilen über dem Kommentar entfernen oder auf andere Weise ändern, funktioniert dies nicht.
quelle
troff
Troff ist das wunderbarste Textverarbeitungssystem. Ich benutze es für meine Dokumente. Es erfordert ein Makrosystem, um einsatzbereit zu sein, und das bekannteste ist das
ms
Makropaket. Kompilieren wir den folgenden Code mit der klassischen-ms
Option.Die dritte Zeile scheint nutzlos zu sein und wäre ohne das Makropaket eigentlich nutzlos. Da zwei Zeilen darunter eine absolute vertikale Positionierung folgt, kann es sinnlos erscheinen, vorher nichts zu drucken. Aber ohne dieses unsichtbare Zeichen hat die vertikale Positionierung keine Auswirkung, obwohl ich nicht sicher bin, ob ich erklären kann, warum (siehe diesen Thread, wenn Sie einen Blick auf die Diskussion werfen möchten). Dies macht den neuen Benutzer verrückt, aber dann sollte der Trick dem erfahreneren Benutzer vertraut werden.
Ich habe gerade mit meiner Lieblingsversion von troff nachgesehen, die nicht sehr bekannt ist (Erbstück troff), aber ich bin mir ziemlich sicher, dass es mit GNU troff immer noch genauso funktioniert.
quelle