Escriba una línea en el programa que parezca inútil [cerrada]

26

Escriba algún programa (el tamaño no importa) y coloque una línea que parezca inútil, pero en realidad no lo es: si se eliminara, el programa se bloquearía o haría algo mal. Siéntase libre de marcar la línea que parece no utilizada por un comentario, o mencione la descripción de su código, como en el ejemplo a continuación (por supuesto, en este ejemplo, la línea en realidad no es necesaria, es solo un ejemplo).

int main(void) {
    /* The line below is actually needed. */
    2 + 2;

    return 0;
}

Como se trata de un concurso de popularidad, gana la solución con el mayor número de votos.

Konrad Borowski
fuente
2
¿Por qué es necesaria la línea en el ejemplo?
Gari BN
3
@GariBN No es: "en este ejemplo, la línea no es realmente necesaria, es solo un ejemplo".
elixenide
99
@EdCottrell Es bueno saberlo ... pensé que me había perdido algo básico ...
Gari BN
2
Entonces es necesario. Por el ejemplo. :-)
Florian F
1
Estoy votando para cerrar esta pregunta como fuera de tema porque los desafíos poco claros ya no están en el tema en este sitio. meta.codegolf.stackexchange.com/a/8326/20469
gato

Respuestas:

33

do

int main(int argc, char **argv) {
    switch(argc) {
        case 2:
            ;
            int allowed = 0;
        case 3:
            argc--;
            break;
        default:
            argc = 3;
    }
    return 0;
}

No se compilará si eliminamos el single ;.

EDITAR :

Solución a continuación:

Esto sucede porque una casedeclaración es solo una etiqueta y, como tal, debe ir seguida de una declaración (a la que el estándar se refiere como un "especificador de acciones a realizar", que descarta las declaraciones). Para evitar esto, prefijamos la declaración con a ;, una declaración nula . Las especificaciones para la caseetiqueta se pueden encontrar aquí en la página 142 (131 en el documento)

Oberon
fuente
44
GCC dice que "una etiqueta solo puede ser parte de una declaración y una declaración no es una declaración".
Vortico
1
Me acaba de morder esto en un programa que estoy escribiendo para la escuela.
Kevin - Restablece a Monica el
Esto hace que los programas reales se vean tan feos en realidad: \.
Val dice reinstalar Mónica
23

C / C ++

Solo un código escrito en el estilo de introducción / tutorial ...

Tutorial nr. 2 : leer en números, realizar operaciones matemáticas en ellos e imprimir los resultados.

//////////////////////////////////////////////////
///////////////////////////////////////////////////
/////                                            //
/////           T  U  T  O  R  I  A  L           //
/////                                            //
///////////////////////////////////////////////////

#include "stdio.h"

int main()
{
    ///////////////////////////////////////////////
    // Local variables (int means integer!!)      /
    int a, b, result;

    ///////////////////////////////////////////////
    // Reading them in                            /
    scanf("%d", &a);
    scanf("%d", &b);

    ///////////////////////////////////////////////
    // Performing an operation, e.g. addition!!!  /
    result = a+b;

    ///////////////////////////////////////////////
    // Why is the next line absolutely mandatory??/
    result = 42;
    printf("The result is: %d", result);

}

Eliminar la línea result = 42;que a primera vista parece superflua y, teniendo en cuenta el objetivo declarado, realmente incorrecto, hará que el programa no haga lo que dice la descripción.

¿Por qué?

¡Los trigrafos atacan de nuevo! ?? / será reemplazado por el preprocesador con \ , que, a su vez, concatenará la siguiente línea en el comentario. El resultado = 42; se convierte en parte del comentario, por lo que "guarda" la línea de impresión. Con el resultado = 42; línea eliminada, la línea printf será tragada por el comentario. Algunos compiladores pueden dar una advertencia, o los trigrafos pueden estar desactivados por defecto y deben activarse para que este ejemplo funcione. El resaltado de sintaxis también puede traicionarlo, pero hay compiladores e IDE que no te dejan más sabio.

vsz
fuente
Al menos en gcc, debe especificar que desea utilizar trigrafos agregando este indicador (-trigraphs). Sin esto, gcc aumenta la advertencia e ignora los trigrafos.
Gari BN
44
¡Buena esa! Me alegro de no haberme desplazado demasiado hacia abajo antes de descubrirlo. Puede cambiar su cita de bloque en texto de spoiler comenzando con en >!lugar de solo >.
aprensivo ossifrage
@squeamishossifrage: gracias, esta era mi intención original, no la usé >!en todas las líneas. Pensé que no se muestran para mí mientras los escribía. Curiosamente, el analizador SE no lo estropea :)
vsz
1
Sabía que algo astuto estaba ocurriendo en el momento en que vi una inclusión local en "stdio.h"lugar de la biblioteca real,<stdio.h>
Braden Best
1
En el momento en que vi los comentarios superfluos, dije en voz alta: "¿Dónde está el trigrafo? Debe haber una trampa ... Ah, ahí está".
gato
19

Espacio en blanco

Lamentablemente, no puedo mostrar mi programa aquí porque StackExchange elimina todos los espacios en blanco finales. Lo mismo ocurre con pastebin.com y pastie.org, por lo que tampoco puedo vincularlo.

Por supuesto, todo el programa "parece inútil", pero si elimina cualquier línea, hará algo diferente.

Timwi
fuente
41
Pero afortunadamente no se perderá nada de valor, porque todo el lenguaje es inútil :-)
aprensivo ossifrage
1
@Timwi ¿qué pasa con el cuadro de "datos de pasta cruda"?
Braden Best
1
@Timwi Lo acabo de probar aquí , y veo a qué te refieres. Pero si coloca texto que no sea un espacio en blanco, se enviará y los datos de la pasta sin procesar no se modificarán. Por ejemplo, podría poner una línea adicional que diga "Copie los datos de pasta sin procesar y elimine esta línea"
Braden Best
8
reemplazar \ t con t. Reemplazar "" con s, reemplazar \ n con n
Cruncher
77
La mejor broma: publicar algo sin escribir realmente el código.
Kaz Wolfe
9

JavaScript:

for (var a = 0, b = 4; ++a < b; a++)b+-

2 + 2; // This line is needed, or it will alert twice!
alert(a);

La razón por la que funciona es porque el cuerpo del fores b+-, no b++o b--; por lo tanto, si elimina la línea requerida, se agregará al bvalor de -alert(a).

Cepillo de dientes
fuente
"se agregará al bvalor de alert(a)": Entonces, ¿no debería b+-ser así b+=?
Gaurang Tandon
@GaurangTandon No; la idea es que parezca b++o b--.
Cepillo de dientes
¿Qué significa b + - realmente significa?
Mhmd
55
@ usuario689 b + -2 + 2. Es por eso que si elimina la línea con 2 + 2;, se evalúa como b + -alert(a);.
Cepillo de dientes
8

DO:

#include <stdio.h>
#include <string.h>

int main() {
    int i,sum;
    char s[4];

    /* Add all the integers < 1000 that contain no '0' or '9' */
    sum=0;
    for (i=0; i<1000; i++) {
        sprintf(s,"%d",i);
        if (strchr(s,'0')) goto skip;
        if (strchr(s,'9')) goto skip;
        sum += i;
      skip:
        i = i; /* Don't delete this line! */
    }
    printf("The answer is %d\n",sum);  /* <<< Should be 258948 */
    return 0;
}

Si elimina la línea i = i;, el código no funcionará. Esto es porque...

... de hecho, ni siquiera se compilará. De acuerdo con el estándar C, las etiquetas como saltar en el ejemplo anterior deben estar asociadas con una declaración. Incluso un solo punto y coma habría sido suficiente, pero si elimina la línea completa, la etiqueta no tiene ninguna declaración asociada y la compilación falla. Esta respuesta explica con un poco más de detalle.

ossifrage aprensivo
fuente
7

APL

Aquí hay una función APL:

i_←{
  ⍺←⎕IO ⋄ ⎕IO←⍺
  ⍵⍴⍳×/⍵
}

Hace lo mismo que la monádica de J i.:

      i_ 5 5
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Puede tomar un argumento izquierdo opcional que proporcione el desplazamiento:

      0 i_ 5 5
 0  1  2  3  4
 5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

La línea ⍺←⎕IO ⋄ ⎕IO←⍺parece inútil ("asignar ⎕IOa , luego asignar a ⎕IO"), pero la primera parte solo se ejecuta si no se proporciona un argumento izquierdo, por lo que de hecho hace algo:

  • si no se proporciona, establezca en (global) ⎕IO.
  • establecer (local) ⎕IOen
marinus
fuente
7

DO#

Func<int, int> fibo;
fibo = null; //Note that this can be set to *any* Func<int, int> reference.  It doesn't matter.
fibo = x => x < 1 ? 1 : fibo(x-1) + fibo(x-2);

La variable fibodebe asignarse antes de poder usarla dentro de una lambda, incluso si se está asignando esa lambda a fibosí misma. Si elimina la asignación (aparentemente inútil), se producirá un error del compilador ("Uso de la variable local no asignada 'fibo'").

Ben Reich
fuente
No es una excepción de referencia nula, es un error del compilador de variables no inicializado. Además, mejor mueva la declaración a su propia línea, porque la declaración no es inútil.
Kendall Frey
@KendallFrey Buen punto! Fijo.
Ben Reich
5

Lote de Windows:

echo hello
pause
echo world

Configure el programa en ejecución y modifique el archivo a:

rem test01
pause
echo hello world

Si elimina o cambia el tamaño del comentario, causará estragos ya que la primera instancia del programa se detiene y luego continúa interpretando desde el byte 19 en adelante.

OJW
fuente
No veo ningún comentario
orion
44
REM (observación) es el operador comentario - stackoverflow.com/questions/11269338
OJW
4

Java

package stackexchange;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Curl
{
    public void getUrl(String address)
    {
        try {
            URL url = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            /* don't remove this line! */
            http://codegolf.stackexchange.com

            while( true ){
                String line = input.readLine();
                if( line==null ) break http;
                System.out.println(line);
            }

            input.close();

        } catch(IOException ex){
            // ignore.
        }
    }

    public static void main(String[] args) {
        Curl curl = new Curl();
        curl.getUrl("http://codegolf.stackexchange.com");
    }
}

Es un programa de trabajo que recupera una página web desde una URL. Te sorprendería que la línea

            http://codegolf.stackexchange.com

compila sin siquiera una advertencia. De hecho, el programa no se compila sin él.

En realidad es una etiqueta http:, seguida de un comentario //codegolf.... La etiqueta se aplica a while y se usa en la break http;declaración.

Florian F
fuente
1
Alguna explicación por favor, o eliminaré esa línea lo que usted diga.
Bill Woodger
3

Rubí

require 'prime'

# Given a regular expression, return the smallest prime containing it
# and the substring of the prime that matches it
def smallest_prime_matching_regexp(regexp)
  match = 'this assignment is necessary even though the value is never used'
  prime = Prime.find { |n| match = n.to_s[regexp] }
  return prime, match
end

[ /4/, /1+2/, /[02468]{2,}/ ].each do |regexp|
  prime, match = smallest_prime_matching_regexp(regexp)
  puts "#{regexp.inspect}:\t#{prime} (#{match})"
end

Algo similar surgió recientemente en el trabajo: un compañero de trabajo en realidad marcó mi inicialización aparentemente innecesaria durante la revisión del código, y realmente estuve tentado de poner la explicación dentro de un bloque de spoilers. Así que haré eso aquí.

La línea es necesaria porque una variable inicializada dentro de un bloque es local para ese bloque. Si lo inicializamos fuera del bloque, entonces el valor puede escapar al alcance del método.

Salida como es:

/4/:    41 (4)
/1+2/:  127 (12)
/[02468]{2,}/:  223 (22)

Salida con la primera línea del método eliminada:

variable local indefinida o método 'match' para main: Object (NameError)

histocrat
fuente
1
Es bastante obvio por qué es necesario ... y de todos modos, una mejor manera de escribir esto sería simplementematch = Prime.find { |n| n.to_s[regexp] }
Doorknob
1
Eso no haría lo que quiero ... Prime.finddevuelve n(por ejemplo, 223), y matchdebe ser n.to_s[regexp](por ejemplo, "22"). Obviamente ideé el problema para hacerlo necesario.
Histocrat
Ah, lo siento, no se dio cuenta que estaba llamando finden Primey no una matriz. De todos modos, todavía es bastante fácil darse cuenta de por qué se necesita esa línea ...
Pomo de la puerta
Lo suficientemente justo. Tal vez mi compañero de trabajo simplemente no estaba observando.
Histocrat
Huh No hay declaraciones variables, pero el enfoque opuesto a la configuración predeterminada local / no local de lo que hace Python. Eso me parecerá extraño si alguna vez decido aprender Ruby.
user2357112 es compatible con Monica el
3

PHP

<?php
$some_html_text= <<<EOT
<h1>This is a Header </h1>
<body> This is a body </body>
EOT;
//This is a comment    

Aquí \n//This is a commentes necesario. Sin él, el código no se ejecutará.

Al menos \nes necesario un carácter después EOT;de ejecutarlo correctamente

Wasi
fuente
3

JAVASCRIPT

var a = function(b) {
    return b;
}

; // This must be here

(function() {
    // more code
}());

Sin el punto y coma, ase convertiría en el valor de retorno de la segunda función, en este caso, es undefined. Porque la función originalmente asignada a ase ejecutará de inmediato con la segunda función como argumento b.

ankr
fuente
2

COBOL (IBM Mainframe)

   ID DIVISION. 
   PROGRAM-ID. USELESS. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  W-WHEN-COMPILED              PIC X(8)BX(8) VALUE SPACE.
   PROCEDURE DIVISION. 
       IF W-WHEN-COMPILED EQUAL TO SPACE 
           NEXT SENTENCE 
       END-IF 
       MOVE SPACE                   TO W-WHEN-COMPILED. 
       MOVE WHEN-COMPILED           TO W-WHEN-COMPILED 

       DISPLAY W-WHEN-COMPILED " HELLO WORLD!" 
       GOBACK 
       . 

Si ejecuta el programa anterior (cualquier IBM Mainframe COBOL desde COBOL II (primer compilador de IBM al estándar de 1985, probablemente también otros COBOL de IBM) el resultado es:

22/02/14 13.11.02 ¡HOLA MUNDO!

Sin embargo, si quita la línea triplemente inútil "MOVER ESPACIO A W-CUANDO SE COMPILA". (el campo tiene un valor inicial de espacio, y tiene otro contenido colocado en él en la siguiente instrucción, y se ramifica de todos modos) el programa no produce salida y en realidad Abends (U4038) (eso significa que se bloquea) con el siguiente mensaje :

 IGZ0037S The flow of control in program USELESS proceeded beyond the 
          last line of the program.  From compile unit USELESS at entry 
          point USELESS at compile unit offset +000003AC at entry offset
          +000003AC at address 119003AC. 

(el código y el texto del mensaje variarían entre los compiladores, las compensaciones dependen del compilador real utilizado y las opciones de compilación, la dirección depende de dónde se carga el programa cuando se ejecuta).

El motivo es el NEXT SENTENCE. Se trata de una Secret GO TO. El compilador busca el siguiente punto / punto completo en la fuente y genera una rama a la siguiente instrucción. Desde COBOL II, el uso de paradas completas / períodos fue relajado. Un programa debe terminar con un punto / punto completo. En este caso, la rama está fuera del final del programa.

Ambos programas compilan 100% limpio (sin mensajes de diagnóstico, código de retorno de cero).

Este comportamiento es una tonta "Extensión de IBM" para COBOL. El estándar de 1985 no permite NEXT SENTENCEdentro de IF/ END-IF( CONTINUEse usa en su lugar, que es un no-op). IBM lo permitió, causando horribles Gotchas de vez en cuando.

Bill Woodger
fuente
2
#include <stdio.h>
#include <stdlib.h>

void strcmp_or_die(char *s, char *t) {
    if(!strcmp(s, t)) {
        printf("Success!\n");
    } else {
        int *ptr = NULL;
        *ptr = 0;
    }
}

int main(void) {
    char blah = '\0'; //segfaults without this line

    char v[2] = "ok";
    strcmp_or_die(v, "ok");
}

Problema de desbordamiento de cadena simple.

fotoionizado
fuente
1
Cualquier compilador decente le dará un diagnóstico de "demasiados inicializadores".
Ben Voigt
¿Sin qué plataforma segfaults blah? Aquí con OpenBSD 5.5 / amd64 y el sistema gcc, nunca falla, ya blahsea ​​que exista o no . El programa compilado asigna 16 bytes de espacio de pila y copia el valor de 16 bits de "ok" a los primeros 2 bytes. El tercer byte no inicializado tiene '\ 0' por suerte. Si blahestá allí, está en el byte 16 y aún no termina la cadena.
kernigh
2

~ - ~!

Este es probablemente el más estúpido y obvio aquí.

'=|hello\|:
'=~!|Useless?\|:
@'[|y|]|n|:

Lanza un error sin esa segunda línea, con ella imprime y.

la barra invertida no es un personaje de escape, jeje.

cjfaure
fuente
¿Cómo se pronuncia el nombre del idioma?
8
@professorfish~-~!
Timtech
1
@professorfish Eso sería "sin comentarios".
cjfaure
1

Lote de Windows

Este es un archivo por lotes que imprime los números del 1 al 10 con una línea vacía después de cada uno:

@echo off

setlocal EnableDelayedExpansion

set NL=^


rem Previous two lines deliberately left blank for NL to work.

for /l %%a in (1,1,10) do (
    echo %%a!NL!
)

endlocal

pause

Esto efectivamente hace uso de un truco sucio para almacenar una nueva línea dentro de una variable (el uso de expansiones retrasadas elimina la línea NL de aspecto más aterrador en la respuesta vinculada). Si elimina o cambia las dos líneas en blanco completamente inútiles sobre el comentario, bueno, no funcionará.

Mover
fuente
0

troff

Troff es el sistema de procesamiento de texto más maravilloso. Lo uso para mis documentos. Requiere un sistema macro para estar listo para ser utilizado, y el más famoso es el mspaquete macro. Vamos a compilar el siguiente fragmento de código con la -msopción clásica .

.\" -ms macro package
.\" the following line seems to be useless
\& \" print an invisible character
.ad c
.sp |300p \" absolute vertical positionning
.ps 36p
.ft B
My title.
.PP
This is a paragraph.

La tercera línea parece ser inútil, y en realidad sería inútil sin el paquete macro. Como está seguido dos líneas más abajo por un posicionamiento vertical absoluto, podría parecer que no tiene sentido imprimir nada antes. Pero sin este personaje invisible, el posicionamiento vertical no tendrá ningún efecto, aunque no estoy absolutamente seguro de poder explicar por qué (vea este hilo si desea echar un vistazo a la discusión). Esto enloquece al nuevo usuario, pero el truco debería familiarizarse con el usuario más experimentado.

Acabo de consultar con mi versión favorita de troff, que no es muy conocida (heirloom troff), pero estoy bastante seguro de que todavía funciona igual con GNU troff.

Thomas Baruchel
fuente
Agradable, esto también sucede en LaTeX. Sin una caja vacía o algo similar, el espacio vertical no funciona correctamente.
orion