Escreva uma linha no programa que pareça inútil [fechado]


26

Escreva algum programa (o tamanho não importa) e coloque uma linha que pareça inútil, mas na verdade não é - se for removida, o programa falhará ou fará algo errado. Sinta-se à vontade para marcar a linha que não parece ser usada por um comentário ou mencionar a descrição do código, como no exemplo abaixo (é claro que, neste exemplo, a linha não é realmente necessária, é apenas um exemplo).

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

    return 0;
}

Como este é um concurso de popularidade, a solução com maior número de votos vence.


2
Por que a linha no exemplo é necessária?
precisa saber é o seguinte

3
@GariBN Não é: "neste exemplo, a linha não é realmente necessária, é apenas um exemplo".
Elixenide

9
@EdCottrell Bom saber ... Achei que eu perdi alguma coisa básica ...
Gari BN

2
Então é necessário. Para o exemplo :-)
Florian F

1
Estou votando para encerrar esta questão como fora de tópico, porque os desafios secretos não estão mais no tópico neste site. meta.codegolf.stackexchange.com/a/8326/20469
cat

Respostas:


33

C

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

Não será compilado se removermos o single ;.

EDIT :

Solução abaixo:

Isso acontece porque uma casedeclaração é apenas um rótulo e, como tal, deve ser seguida por uma declaração (à qual o padrão se refere como um "especificador de ações a serem executadas", que exclui as declarações). Para evitar isso, prefixo declaração com um ;, uma declaração nula . As especificações para a caseetiqueta podem ser encontradas aqui na página 142 (131 no documento)


4
O GCC diz que "um rótulo só pode fazer parte de uma declaração e uma declaração não é uma declaração".
Vortico

1
Eu fui mordido por isso em um programa que estou escrevendo para a escola.
Kevin - Restabelece Monica

Isso faz com que os programas reais pareçam tão feios, na verdade: \.
val diz Reintegrar Monica

23

C / C ++

Apenas algum código escrito no estilo de introdução / tutorial ...

Tutorial nr. 2 : ler números, executar operações matemáticas neles e imprimir os 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);

}

Remover a linha result = 42;que, à primeira vista, parece supérflua e, considerando o objetivo declarado, realmente errado, fará com que o programa não faça o que a descrição afirma.

Por quê?

Trígrafos atacam novamente! ?? / será substituído pelo pré-processador por \ , que, por sua vez, concatenará a próxima linha no comentário. O resultado = 42; torna-se parte do comentário e, por isso, "salva" a linha de impressão. Com o resultado = 42; linha removida, a linha printf será engolida pelo comentário. Alguns compiladores podem emitir um aviso ou trigramas podem estar desativados como padrão e devem estar ativados para que este exemplo funcione. O destaque da sintaxe também pode traí-lo, mas existem compiladores e IDEs em torno dos quais você não fica mais sábio.


Pelo menos no gcc, você deve especificar que deseja usar trigrafs adicionando esse sinalizador (-trigraphs). Sem isso, o gcc sobe o aviso e ignora os trigramas.
precisa saber é o seguinte

4
Agradável! Fico feliz por não ter rolado muito longe antes de descobrir. Você pode alterar sua cota de bloco em texto de spoiler iniciando-o em >!vez de apenas >.
Ossifrage squeamish

@squeamishossifrage: obrigado, essa era minha intenção original, eu >!não usei apenas em todas as linhas. Eu acho que eles não são exibidos para mim como eu os escrevi. Curiosamente, o analisador SE não estraga tudo :)
vsz 27/01

1
Eu sabia que algo estava acontecendo sorrateira o segundo eu vi incluem um local, "stdio.h"em vez da biblioteca real incluem,<stdio.h>
Braden Melhor

1
No momento em que vi os comentários supérfluos, disse em voz alta: "Onde está o trigrama? Deve haver um rastro - Ah, aí está".
gato

19

Espaço em branco

Infelizmente, não posso mostrar meu programa aqui porque o StackExchange retira todo o espaço em branco à direita. O mesmo vale para pastebin.com e pastie.org, portanto, também não posso vincular a ele.

Obviamente, o programa inteiro "parece inútil", mas se você remover qualquer linha, ele fará algo diferente.


41
Mas, felizmente, nada de valor será perdido, porque toda a linguagem é inútil :-) #
ossifrage melindroso

1
@ Timwi, e a caixa "dados colados em bruto"?
Braden Best

1
@ Timwi Acabei de testar aqui e entendo o que você quer dizer. Mas se você colocar um texto que não esteja em branco, ele será enviado e os dados brutos da pasta permanecerão intocados. Por exemplo, você pode colocar uma linha extra dizendo "Copie os dados da pasta não processada e exclua esta linha"
Braden Best

8
substitua \ t por t. Substitua "" por s, substitua \ n por n
Cruncher

7
Melhor brincadeira de sempre: publique algo sem realmente escrever 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);

A razão pela qual funciona é porque o corpo do foré b+-, não b++ou b--; portanto, se você remover a linha necessária, ela será adicionada ao bvalor de -alert(a).


"será adicionado ao bvalor dealert(a) ": Então, não deveria b+-ser b+=?
Gaurang Tandon 22/02

@GaurangTandon No; a ideia é que pareça b++ou b--.
Escova de dentes

o que significa b + - actualy?
Mhmd 22/02

5
@ user689 b + -2 + 2. É por isso que se você excluir a linha com 2 + 2;, ela será avaliada como b + -alert(a);.
Escova de dentes

8

C:

#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;
}

Se você excluir a linha i = i;, o código não funcionará. Isto é porque...

... na verdade, nem compilará. De acordo com o padrão C, rótulos como pular no exemplo acima devem ser associados a uma declaração. Mesmo um único ponto-e-vírgula seria suficiente, mas se você excluir a linha inteira, o rótulo não terá nenhuma instrução associada e a compilação falhará. Esta resposta explica um pouco mais detalhadamente.


7

APL

Aqui está uma função APL:

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

Faz o mesmo que o monádico 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

Pode-se usar um argumento à esquerda opcional que fornece o deslocamento:

      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

A linha ⍺←⎕IO ⋄ ⎕IO←⍺parece inútil ("atribuir ⎕IOa , depois atribuir a⎕IO "), mas a primeira parte só será executada se nenhum argumento à esquerda for fornecido, portanto, na verdade, ele faz algo:

  • se não for dado, defina como (global) ⎕IO.
  • defina (local) ⎕IOpara

7

C #

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);

A variável fibodeve ser atribuída antes que você possa usá-la dentro de um lambda, mesmo se você estiver atribuindo esse lambda a fibosi próprio. Se você remover a atribuição (aparentemente inútil), ocorrerá um erro do compilador (“Uso da variável local não atribuída 'fibo'”).


Não é uma exceção de referência nula, é um erro não inicializado do compilador de variáveis. Além disso, é melhor mover a declaração para sua própria linha, porque a declaração não é inútil.
Kendall Frey

@KendallFrey Good point! Fixo.
Ben Reich

5

Lote do Windows:

echo hello
pause
echo world

Defina o programa em execução e modifique o arquivo para:

rem test01
pause
echo hello world

Se você remover ou redimensionar o comentário, ele causará estragos quando a 1ª instância do programa for pausada e continuará a interpretar a partir do 19º byte em diante.


Não vejo comentários.
orion 30/05

4
REM (observação) é o operador de comentário - stackoverflow.com/questions/11269338
OJW 30/14

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");
    }
}

É um programa de trabalho que recupera uma página da web de um URL. Você pode se surpreender que a linha

            http://codegolf.stackexchange.com

compila sem sequer um aviso. De fato, o programa não compila sem ele.

Na verdade, é um rótulo http:, seguido de um comentário //codegolf.... O rótulo se aplica ao tempo e é usado na break http;declaração.


1
Alguma explicação, por favor, ou removerei essa linha do que você disser.
Bill Woodger

3

Rubi

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

Uma coisa semelhante surgiu recentemente - um colega de trabalho sinalizou minha inicialização aparentemente desnecessária durante a revisão de código, e fiquei realmente tentado a colocar a explicação dentro de um bloco de spoilers. Então eu vou fazer isso aqui.

A linha é necessária porque uma variável inicializada dentro de um bloco é local para esse bloco. Se o inicializarmos fora do bloco, o valor poderá escapar para o escopo do método.

Saída como está:

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

Saída com a primeira linha do método removida:

variável local indefinida ou método `match 'para main: Object (NameError)


1
É bastante óbvio o porquê que é necessário ... e mesmo assim, a melhor maneira de escrever este seria apenasmatch = Prime.find { |n| n.to_s[regexp] }
Doorknob

1
Isso não faria o que eu quero ... Prime.findretorna n(por exemplo, 223) e matchprecisa ser n.to_s[regexp](por exemplo, "22"). Obviamente, inventei o problema para tornar isso necessário.
histocrat

Ah, desculpe, não percebi que você estava chamando findon Primee não um array. Enfim, ainda é bastante fácil perceber por que essa linha é necessária ...
Maçaneta da porta

Justo. Talvez meu colega de trabalho estivesse apenas observando.
histocrat

Hã. Nenhuma declaração de variável, mas a abordagem oposta ao padrão local / não local do que o Python faz. Será estranho se eu decidir aprender Ruby.
User2357112 suporta Monica

3

PHP

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

Aqui, \n//This is a comment é necessário. Sem ele, o código não será executado.

Pelo menos um \ncaractere é necessário depois EOT;para executá-lo corretamente


3

JAVASCRIPT

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

; // This must be here

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

Sem o ponto-e-vírgula, então aseria o valor de retorno da 2ª função - nesse caso, é undefined. Porque a função originalmente atribuída a aserá executada imediatamente com a segunda função como argumento b.


2

COBOL (Mainframe da IBM)

   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 
       . 

Se você executar o programa acima (qualquer IBM Mainframe COBOL desde COBOL II (primeiro compilador IBM para o padrão 1985, provavelmente outros IBM COBOLs também)), a saída será:

22/02/14 13.11.02 OLÁ! MUNDO!

No entanto, se você remover a linha triplamente inútil "MOVER ESPAÇO PARA W-WHEN-COMPILED". (o campo tem um valor inicial de espaço e tem outro conteúdo nele na próxima instrução, e é ramificado de qualquer maneira) o programa não produz saída e, na verdade, é encerrado (U4038) (isso significa que ele trava) com a seguinte mensagem :

 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. 

(o código e o texto da mensagem variam entre os compiladores, as compensações dependem do compilador real usado e das opções de compilação; o endereço depende de onde o programa é carregado quando EXECUTADO).

O motivo é o NEXT SENTENCE . Isto é um Secret GO TO. O compilador procura o próximo ponto / ponto final na fonte e gera uma ramificação para a seguinte instrução. No COBOL II, o uso de pontos / períodos completos foi relaxado. Um programa deve terminar com um ponto final / período. Nesse caso, a ramificação está fora do final do programa.

Ambos os programas compilam 100% de limpeza (sem mensagens de diagnóstico, código de retorno zero).

Esse comportamento é um "IBM Extension" idiota para COBOL. O Padrão de 1985 não permite NEXT SENTENCEdentro de IF/ END-IF( CONTINUEé usado em vez disso, o que é um no-op). A IBM permitiu - causando Gotchas horríveis de tempos em tempos.


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 simples de estouro de string.


1
Qualquer compilador decente fornecerá um diagnóstico de "muitos inicializadores".
Ben Voigt

Qual plataforma segfaults sem blah? Aqui, com o OpenBSD 5.5 / amd64 e o sistema gcc, ele nunca é segmentado, esteja ou não blahpresente. O programa compilado aloca 16 bytes de espaço na pilha e copia o valor de 16 bits de "ok" para os 2 primeiros bytes. O terceiro byte não inicializado tem '\ 0' por sorte. Se blahhouver, ele está no 16º byte e ainda não está encerrando a string.
kernigh

2

~ - ~!

Este é provavelmente o mais estúpido e óbvio aqui.

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

Ele gera um erro sem essa segunda linha, com ela é impressa y.

a barra invertida não é um personagem de escape, hehe.


Como você pronuncia o nome do idioma?

8
@professorfish~-~!
Timtech

1
@professorfish Isso seria "sem comentários".
cjfaure

1

Lote do Windows

Este é um arquivo em lotes que imprime os números 1 a 10 com uma linha vazia após cada um:

@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

Isso efetivamente utiliza um hack sujo para armazenar uma nova linha dentro de uma variável (o uso de expansões atrasadas se livra da linha NL de aparência mais assustadora na resposta vinculada). Se você remover ou alterar as duas linhas em branco completamente inúteis acima do comentário, bem, não funcionará.


0

troff

Troff é o mais maravilhoso sistema de processamento de texto. Eu o uso para meus documentos. Requer um sistema de macro para estar pronto para ser usado, e o mais famoso é o mspacote de macro. Vamos compilar o seguinte trecho de código com a -msopção clássica .

.\" -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.

A terceira linha parece ser inútil e seria realmente inútil sem o pacote de macro. Como é seguido duas linhas abaixo por um posicionamento vertical absoluto, pode parecer sem sentido imprimir nada antes. Mas sem esse caráter invisível, o posicionamento vertical não terá efeito, embora eu não tenha certeza absoluta de que poderia explicar o porquê (veja este tópico se quiser dar uma olhada na discussão). Isso deixa o novo usuário louco, mas o truque deve se familiarizar com o usuário mais experiente.

Acabei de verificar com a minha versão favorita do troff, que não é muito conhecida (herança da herança), mas tenho certeza de que ainda funciona da mesma forma com o GNU troff.


Bom, isso também acontece no LaTeX. Sem uma caixa vazia ou algo semelhante, o espaçamento vertical não funciona corretamente.
orion 30/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.