O que? Sem erro? [fechadas]

197

Sua tarefa é simples. Escreva um programa que obviamente deva produzir um erro à primeira vista, quando compilado ou executado, mas que não produza ou produza algum outro erro não relacionado. Este é um concurso de popularidade, então seja criativo.

Jwosty
fonte
11
hmmmm .... este é um quebra-cabeças. +1
Tim Seguine
11
Gostaria de poder encontrá-lo ... havia um antigo exemplo de PL / I que incluía uma declaração ao longo das linhas de "se se = então então = outro else else = se então outro ..." (o PL / eu permitia usar suas palavras-chave como nomes de variáveis, e tinha uma expressão condicional semelhante ao C de: que também usou o / then / else palavras-chave se ...)?
keshlam
8
Eu sugiro a linguagem do cérebro inteiro, porque o código BF parece que não será compilado.
Agi Hammerthief
@NigelNquande apenas se você não estiver familiarizado com ele ...;)
Jwosty

Respostas:

281

C ++

Certifique-se de compilar o seguinte código no modo de conformidade padrão (por exemplo, para g ++, use o sinalizador -ansi):

int main()
{
  // why doesn't the following line give a type mismatch error??/
  return "success!";
}

Como funciona:

A ?? / é uma sequência trigraph que é traduzida em uma barra invertida que escapa à nova linha a seguir; portanto, a próxima linha ainda faz parte do comentário e, portanto, não gera um erro de sintaxe. Observe que, em C ++, a omissão do retorno mainé bem definida e equivalente ao retorno 0, indicando uma execução bem-sucedida.

celtschk
fonte
7
Eu sinto que a primeira resposta acabou de ganhar isso logo de cara.
temporary_user_name
11
Também é válido no C99.
R ..
11
há avisos com
-Wall #
2
@ BЈовић parede sempre jogar aviso sobre tudo
kiwy
4
@ Kiwy Lança aviso apenas para código de lixo como acima. O -Wall não lança avisos para tudo.
22314
86

Rubi

Sempre um fã deste.

x = x

Não NameError. x é agora nil.

Este é apenas um "recurso" do Ruby :-)

Aqui está um mais mundano que já me pegou antes:

x = 42

if x < 0
  raise Exception, "no negatives please"
elseif x == 42
  raise Exception, "ah! the meaning of life"
else  
  p 'nothing to see here...'
end 

Imprime "nada para ver aqui".

É elsif , não elseif . (e certamente não é difícil para o programador python rebelde (eu)!) Portanto, para o intérprete elseif parece uma chamada de método normal, e como não inserimos o bloco x <0, seguimos em frente para else e não crie uma exceção. Esse bug é incrivelmente óbvio em qualquer ambiente de destaque de sintaxe, felizmente (?) O código golf não é um ambiente assim.

Roippi
fonte
5
Você me pegou. Já fiz Python e Lua antes e agora estou começando no Ruby. Lua usa esse.
Riking
7
O significado do universo não é nada para ver?
user80551
77

C?

Código bastante normal aqui ...

void main() = main--;

É Haskell, não C. Ele define uma função chamada "void" que recebe dois argumentos. O primeiro é nomeado "principal" e, se o segundo (sem nome) for uma tupla vazia, ele retornará a variável "principal". "-" inicia um comentário em Haskell, então o ";" é comentado.

intx13
fonte
21
Então, em outras palavras, é trapaça?
Sr. Lister
75
Trapacear é normal em competições de desafio de código. Chamamos isso de criatividade. : P
Joe Z.
31
Eu chamaria isso de trapaça, não de criatividade. Você precisa definir o ambiente em que está executando antes de poder considerar se algum código irá com erro ou não. Caso contrário, eu poderia apenas fornecer o ruído da linha que é Malbolge e perguntar se ele compila.
Tim S.
5
Só deveria fazer você parar por um segundo e dizer 'ei, você pode fazer isso?' :)
intx13
10
@JoeZ. Ele pode parecer perl em alguns casos.
user80551
72

Javascript

var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');

Veja como funciona:

O primeiro aé realmente um а(ou seja, Cryllic Unicode "a").

Maçaneta da porta
fonte
8
Esse truque pode ser aplicado a qualquer linguagem que aceite o token Unicode (por exemplo, Java, C #).
N
83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, exemplificado pelo seu nome de usuário
TheDoctor
9
solução muito óbvia
thepirat000
6
óbvio demais para quem já se deparou com isso antes. Tenho certeza de que muitos novatos e os chamados "especialistas da web" podem ser enganados.
precisa saber é o seguinte
42
Óbvio? Então, você sempre olha os nomes das variáveis ​​por meio dos números Unicode, e não pela aparência deles? Você pode perceber se procurar por "a" (ou "а"?) E não conseguir encontrar o que espera, mas, ao ler, não poderá vê-lo (pelo menos na fonte mostrada aqui).
Tim S.
70

Javascript

Quando eu estava fornecendo o código a seguir, me disseram muitas vezes "Deve ser um erro de digitação! Como isso pode funcionar?" .

console.log( 42..toString(2) );

A descrição abaixo foi copiada exatamente de um dos casos recentes .

Como você provavelmente sabe, em JavaScript tudo, exceto literais, é um objeto. Os números também são objetos. Então, teoricamente (e praticamente), você pode obter propriedades ou chamar métodos de qualquer não literal por meio de notação de ponto, como você 'string'.lengthou [1,2,3].pop(). No caso de números, você pode fazer o mesmo, mas lembre-se de que, após um único ponto, o analisador procurará uma parte fracionária do número que espera um valor flutuante (como em 123.45). Se você usar um inteiro você deve "dizer" o analisador de que uma parte fracionária é vazio, definindo um ponto extra antes de abordar uma propriedade: 123..method().

Visão
fonte
18
Como um cara de lua, eu estava esperando422
mniip
3
Não vi esse uso antes, muito arrumado.
Nit
5
Sinto mal por ser perfeitamente utilizado para a ..notação, mas inteiramente ignorante em relação à .toString(a freaking argument here?)notação: P Oh bem, percebi isso por agora :)
David Mulder
O que isso gera? E porque ? Estou curioso.
Nicolas Barbulesco
3
Para os preguiçosos, o argumento especifica a base (portanto, isso imprimirá 42 em binário) e não é de todo importante para esse código. ..é a parte confusa.
Kat
63

bater

#!/bin/bash

[ 1 < 2 ] && exit

for i in `seq 1 $[2 ** 64]`
    do "$0" | "$0"
done

while [[ false ]]
    do :
done

if maybe
    do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi

Resultados

  • Você pode esperar que o script não produza nenhum erro, pois ele sai após o primeiro comando. Não faz.

  • Você pode esperar as mensagens de erro típicas causadas por uma bomba de garfo em andamento devido ao forloop. Não há garfo bomba.

  • Você pode esperar que o bash reclame sobre o maybecomando ausente ou todo o grupo de erros de sintaxe dentro do ifbloco. Não vai.

  • A única mensagem de erro que o script pode produzir termina 2: No such file or directory.

Explicação

  • [não é especial para o bash; portanto < 2, executa, como sempre, o redirecionamento. A menos que haja um arquivo com nome 2no diretório atual, isso causará um erro.

  • Devido ao erro acima, o comando anterior &&terá um status de saída diferente de zero e exitnão será executado.

  • O forloop não é infinito. De fato, não há loop. Como o bash não pode calcular a 64ª potência de 2, o resultado da expressão aritmética é 0.

  • [[ false ]]testa se falseé uma sequência nula. Não é, então esse whileloop é infinito.

  • Por causa do exposto, a ifinstrução nunca é executada, portanto, nenhum erro é detectado.

Dennis
fonte
55

Perl

use strict;
use warnings;
Syntax error!
exit 0;

Fonte e explicação: https://stackoverflow.com/questions/11695110

multidão
fonte
137
Programas Perl geralmente parecem erros.
ugoren
11
@ugoren Somente quando escrito e lido por pessoas com pouco conhecimento de Perl.
TLP
8
Você tem que amar que @ do ugoren comentário tem duas vezes mais upvotes como a resposta :)
yo'
2
Lembra-me do truque de shell do Windows: "Se você está feliz e sabe disso, Erro de sintaxe!"
Jwosty
47

Java

class Gotcha {
    public static void main(String... args) {
        try  {
            main();
        } finally {
            main();
        }
    }
}

Nenhuma pilha transborda aqui; seguir em frente.

À primeira vista, isso deve produzir um StackOverflowError, mas não! Na verdade, ele funciona para sempre (pelo menos para todos os efeitos práticos; tecnicamente, terminaria após um tempo muitas ordens de magnitude maiores que a idade do universo). Se você quiser saber como / por que isso funciona, consulte isso . Além disso, se você está se perguntando por que podemos chamar main()sem argumentos quando o método principal geralmente precisa de um String[]argumento: é porque declaramos que é argumento variável aqui, o que é perfeitamente válido.

arshajii
fonte
3
Como a pergunta que você vinculou explica, ela não é executada indefinidamente, mas por um tempo extremamente longo.
Kevin
11
@ Kevin Não vamos ficar desnecessariamente pedantes aqui; "maior que a idade do universo" é, para todos os efeitos práticos, "para sempre".
Arshajii 9/03
8
Você diz "Nenhuma pilha transborda aqui"; quando, de fato, o sistema continua lançando uma sobrecarga contínua da pilha e, eventualmente, lança uma exceção de sobrecarga da pilha. (como você mencionou, eventualmente pode demorar muito) E depende da profundidade da pilha. Em uma VM menor ou sistema incorporado, a profundidade da pilha pode ser muito menor.
McKay
@ McKay Essa afirmação é claramente uma mera linha descartável, não para ser tomada literalmente. O OP solicita um programa que parece produzir um erro, mas não produz. No caso geral, a resposta acima satisfaz esse requisito. Claro, podemos inventar uma situação obscura onde isso não acontece, mas isso não invalida a resposta. Espero que você reconsidere seu voto negativo.
arshajii
3
@McKay A propósito, suponha que o tamanho da pilha seja pequeno (por exemplo, 100 em oposição ao normal ~ 10.000), e ainda podemos fazer 10.000.000 de chamadas por segundo. Então, o tempo total de execução chega a 4.019.693.684.133.147 anos - ainda muitas ordens de magnitude maiores que a idade do universo.
arshajii
42

CoffeeScript

What? No error? Yep, this code does not have any bugs, why would it?

?seguido por um espaço é o operador que chama uma função, mas somente se ela existir. O JavaScript não tem uma função chamada What, portanto, a função não é chamada e seus argumentos são simplesmente ignorados. As outras palavras no código são chamadas de função que na verdade não são chamadas, porque a Whatfunção não existe. No final, ?é operador de existência, pois não é usado na função de chamada. Outros terminadores de frases, como .ou !não funcionariam, como .é para métodos, e !não é operador (que não pode ser usado após um identificador). Para ler como o CoffeeScript converteu isso em JavaScript, visite http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C % 20% por% 20it% 20% 3F .

Konrad Borowski
fonte
36

VBScript

O &operador no VBScript é concatenação de strings, mas o que são os operadores &&e &&&? (Lembre-se de que o operador "e" no VBScript Andnão é &&.)

x = 10&987&&654&&&321

Esse fragmento de programa é VBScript legal. Por quê? E qual é o valor x?

O lexer divide isso como x = 10 & 987 & &654& & &321. Um literal inteiro que começa com &é, estranhamente, um literal octal. Um literal octal que termina com &é, ainda mais bizarro, um inteiro longo. Portanto, o valor de x é a concatenação dos valores decimais desses quatro inteiros: 10987428209.

Eric Lippert
fonte
8
Isso é só ... uau.
Primo20
27

Objetivo-C

Não é grande coisa, mas me surpreendeu ao tentar colocar um link dentro de um comentário:

http://www.google.com
        return 42;

http é uma etiqueta de código aqui, essas etiquetas são usadas nas instruções goto

Piotr
fonte
8
Isso deve funcionar em qualquer linguagem C que suporte //comentários.
Ilmari Karonen
Sim, provavelmente, eu só não tinha certeza ao postar
Piotr
14
Porém, limite um URL por protocolo por escopo.
Ben Voigt
11
Você ainda pode usar https: // no mesmo escopo.
Florian F
25

C #

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

Como o Barmétodo faz a yield, o método realmente não é executado quando chamado, ele retorna um enumerador que, quando iterado, s executa o método.

McKay
fonte
At Last ... Aqui é o foo e bar :)
VVK
11
É para isso que servem foo e bar;) nomes de coisas que realmente não importam.
McKay
22

C

main=195;

Funciona em plataformas x86, onde 195 é o código de operação para ret. Faz nada,

Ugoren
fonte
O opcode para ret é 195, não 193, certo?
Dennis
Não funciona para mim. Eu esperaria isso para executar o código no endereço 195.
nwellnhof
Tbanks @ Dennis, o código estava correto, a explicação errada.
ugoren
3
Em qualquer plataforma (incluindo o x86 moderno ) em que as páginas podem ser lidas sem serem executáveis, isso trava na entrada mainporque mainfoi colocado no segmento de dados, que não é executável. Surpreendentemente, const int main=195vai não falhar (no x86) (mas irá produzir um estado de saída de lixo) porque .rodata, por padrão é colocado no mesmo segmento .texte por isso é executável. ( const char main[]="1\300\303";Sairá com sucesso (ainda em x86)!)
Zwol
2
Estou em uma máquina de 64 bits (não sei se isso vai mudar alguma coisa) e main = 195 fornece um segfault, mas const int main = 195; trabalho.
W4etwetewtwet
21

Java

Provavelmente óbvio demais.

public static void main(String[] varargs) throws Exception{
    char a, b = (char)Integer.parseInt("000d",16);
    // Chars have \u000d as value, so they're equal
    if(a == b){
        throw new Exception("This should be thrown");
    }
}

O que?

Lança um erro de sintaxe depois \u000d. \u000dé o unicode para uma nova linha. Mesmo sendo comentado, o compilador Java trata o que se segue a isso como código, uma vez que não é mais comentado.

Tom Verelst
fonte
11
o seu varargsnão são varargs;)
Navin
A questão era "código que parece que falha mas não", não "código que parece que falha, mas o faz de uma maneira diferente". Ter um erro de sintaxe em vez de uma exceção ainda é um erro.
Nzall
19
Eu acho que você deveria ler a pergunta original novamente: "ou produz algum outro erro não relacionado".
precisa
Na verdade, sem o \u000d, ele usaria uma referência ao valor indefinido a.
LegionMammal978
19

C ++

#include <iostream>

int succ(int x)
{
  return x + 1;
}

int succ(double x)
{
  return int(x + 1.0);
}

int succ(int *p)
{
  return *p + 1;
}

int main()
{
  std::cout << succ(NULL) << '\n';
}

Por quê?

NULLé uma constante intergal, para que coincida com a intsobrecarga estritamente melhor que o int*um. Ainda assim, a maioria dos programadores se NULLassociou a ponteiros, portanto, pode ser esperada uma desreferência de ponteiro nulo.

Angew
fonte
11
Felizmente, o C ++ 11 permite que as implementações definam NULLcomo nullptr, e as implementações que o fazem (ainda não sei, mas espero) irão fornecer a falha de segmentação esperada.
hvd
16

Pitão

print """""quintuple-quoted strings!"""""

Perfeitamente válido, mas é difícil adivinhar o resultado. Os primeiros 3 "caracteres iniciam uma sequência multilinha e os próximos dois fazem parte da sequência. No final, os três primeiros terminam a sequência e os dois últimos são uma sequência vazia literal que é concatenada pelo analisador para a sequência multilinha. .

Fraxtil
fonte
20
Apenas um bônus: print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Konrad Borowski
15

Javascript

if (1/0 === -1/0) {
  throw "Surely there's an error in here somewhere...";
}

Como funciona:

Há infinito positivo e negativo em JS, e não há erro para dividir por zero.

temporary_user_name
fonte
2
Você deve ser capaz de fazer alguns truques com NaN também ...
intx13
8
meh, isso acontece em qualquer idioma com carros alegóricos.
Navin
3
@ Navin: em qualquer idioma com flutuadores onde a divisão por zero não causa um erro.
nwk
2
@nwk O padrão IEEE para carros alegóricos diz que a divisão por zero deve ser uma inf. Não conheço nenhum idioma que mude isso.
Navin
11
O IEEE 754 especifica dois modelos: sinalização NaN / Inf (que gera exceções na divisão zero do FP, raiz quadrada de -1, subfluxo / excesso, etc.) e não sinalização (que trata NaN/ Infexatamente como valores algébricos regulares com matemática bem definida neles). O hardware FP moderno pode ser configurado para operar nos dois sentidos. Agnóstico à linguagem; vergonha de não saber.
11138 ulidtko
14

C ++

A mistura de trigramas e lambdas sem espaço pode ser bastante confusa e definitivamente parecer errada para as pessoas que não estão cientes dos trigramas:

int main()
{
    return??-??(??)()??<return"??/x00FF";??>()??(0??);
}

Como funciona:

Algumas seqüências que consistem em 3 símbolos, começando com ??, são chamadas trigramas e serão substituídas por um pré-processador totalmente compatível. Pré-processada, a linha em questão tem a seguinte aparência: return ~ [] () {return "\ x00FF"; } () [0]; Como se pode ver, isso não passa de uma função lambda supérflua retornando uma string que consiste no caractere 0xFFth. O [0] apenas extrai esse caractere e ~ NÃO o nota, então 0 é retornado.

aVoX
fonte
12
O programa válido C ++ int main(){(([](){})());}também pode olhar bom quando trigraphed ...
Angew
11
O que isso faz?
Joe Z.
11
@ Joe Z [](){}é uma função lambda, assim como [](int a){return a+1;}é uma. ([](){})()chama essa função, retornando voidse não me engano. O todo (([](){})());então se resume a (void);, que é uma afirmação que não faz nada. mainentão retorna zero, como deveria sem uma returndeclaração.
tomsmeding
13

VBA / VB6

Private Sub DivByZero()

    Dim x() As String
    x = Split(vbNullString, ",")

    Debug.Print 1 / UBound(x)

End Sub

A divisão de uma cadeia de caracteres delimitada por vírgula vazia deve fornecer uma matriz vazia. Deve ser uma divisão óbvia por erro zero, certo?

Não. Surpreendentemente, quando qualquer seqüência de comprimento zero é dividida, o tempo de execução fornece uma matriz com um limite inferior de 0 e um limite superior de -1. O código acima produzirá -1.

Comintern
fonte
@minitech Na verdade, se você passar um array vazio para o UBound, ele fornecerá um erro de Subscrito fora do intervalo.
Comintern
… bem. Retiro o que eu disse. VBA = /
Ry-
11
@minitech Sim. Eu entendo que isso foi um bug na implementação original do Split no VB6. No .NET, eles intencionalmente "adicionaram" (ou talvez seja melhor documentada) o comportamento de matrizes vazias retornando um UBound de -1 para manter a compatibilidade com todos os códigos VB6 que se beneficiaram desse hack. Dividir uma cadeia nula é a única maneira de obter essa matriz de forma nativa no VBA / VB6 sem chamadas à API do Windows.
Comintern
12

Javascript

5..toString();
5 .toString();

Dá: 5

Enquanto que:

5.toString();

Dá erro de sintaxe

Como funciona:

JavaScript tenta analisar ponto em um número como um literal de ponto flutuante

Sumeet Kashyap
fonte
13
Como aconteceu que você postou exatamente o mesmo caso que eu fiz uma hora depois de mim?
VisioN
11
Hey Vision, desculpe, mas não verifiquei sua resposta. Eu também adicionei um caso com espaço. Eu li isso uma vez no jardim javascript nada mais.
Sumeet Kashyap
11
Sumeet, não se desculpe. Sua resposta é melhor - e muito mais clara - que a resposta do @VisioN.
Nicolas Barbulesco
12

HTML

Primeiro post aqui, não tenho certeza se entendi ou não, mas aqui vai.

<html>
    <head></head>
    <body>
        <?php $_POST['non-existant'] = $idontexisteither ?>
    </body>
</html>

É um .htmlarquivo ...

Albzi
fonte
9
Portanto, o truque é que ele não executará o bloco PHP porque o arquivo tem .htmlextensão e seu servidor da Web não está configurado para analisar .htmlarquivos como PHP?
VisioN 7/03/14
5
Sim. Isso é trapaça? @VisioN
Albzi
2
Tenho certeza que isso é trapaça. Escreva pelo menos "HTML" em negrito na parte superior.
Navin
Agradável ! :-) O truque funcionou em mim.
Nicolas Barbulesco
11
Eu editei para que fique claro que língua está escrito em
vijrox
9

PHP (40 bytes)

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

Esta foi a resposta que dei nesta pergunta: Programa Insanity Check

A ideia era criar um código que produzisse erros.

O primeiro erro em que pensaremos é um erro de sintaxe.

Não há erros de sintaxe ...

Outro seria que a classe / função não existe.

Não corre tão longe ...

Outro seria um tempo limite ou um estouro de memória, mas, novamente, não chega tão longe ...

Teste o código aqui: http://writecodeonline.com/php/ (remova o <?no início do teste).

Ismael Miguel
fonte
3
Este é um concurso de popularidade. Não há necessidade de apertar o código ur para salvar bytes. Apenas reformatá-lo para melhor legibilidade;)
Songo
Vou adicionar uma versão legível mais tarde. Usei a mesma resposta exata e não a editei.
Ismael Miguel
foreach(e()as&$e);é o núcleo desta solução. e()é apenas para manter o verificador de sintaxe funcionando e &$edepois disso asé o que causa a falha.
TheConstructor
Na verdade, tudo tem um papel importante.
Ismael Miguel
9

VBScript

Os usuários do Visual Basic 6 saberão que

If Blah Then Foo Bar

é legal, como é

If Blah Then 
    Foo Bar
End If

Mas e quanto

If Blah Then Foo Bar End If

? Acontece que isso é legal no VBScript, mas não no VB6. Por quê?

É um bug no analisador; a intenção era rejeitar isso. O código que detecta o End Ifdeveria também verificar se era uma Ifinstrução de várias linhas , e não o fez. Quando tentei corrigi-lo e enviei uma versão beta com essa correção, uma organização influente de notícias do setor descobriu que eles tinham essa linha de código em um de seus programas VBScript e disse que daria uma nova classificação baixa à nova versão, a menos que corrigido o bug, porque eles não queriam mudar seu código fonte.

Eric Lippert
fonte
Existe alguma desvantagem em deixar o bug não corrigido, além de permitir que você escreva um código VBS que não é válido no VB6?
Gabe
11
@ Gabe: Não, não há outra desvantagem além de ser mais difícil portar o código VBScript para o VB.
precisa
11
Um nome ! Quem é essa organização de notícias?
Nicolas Barbulesco
9

C

Isso me lembrou um erro que eu encontrei quando aprendi C. Infelizmente, a variante original não parece funcionar com um GCC atual, mas este ainda funciona:

#define ARR_SIZE 1234
int main() {
    int i = ARR_SIZE;
    int arr[ARR_SIZE];
    while(i >= 0) {
        (--i)[arr] = 0;
    }
    i = *(int*)0;
}

Obviamente segfaults porque desreferenciamos um ponteiro nulo, certo?

Errado - na verdade, é um loop infinito, pois nossa condição de loop é desativada em um. Devido ao decremento do prefixo, ié executado de 1023 a -1. Isso significa que a atribuição substitui não apenas todos os elementos arr, mas também o local da memória diretamente antes dele - que é o local onde iestá armazenado. Ao chegar -1, isobrescreve-se 0e, assim, a condição do loop é atendida novamente ...

Esta foi a variante original I, que não posso mais reproduzir:

O mesmo ocorreu com o iaumento de 0 e a redução de um. O último GCC sempre armazena iantes arrna memória; isso deve ter sido diferente nas versões mais antigas (talvez dependendo da ordem da declaração). Foi um erro real que produzi em um dos meus primeiros programas de brinquedos que lidam com matrizes.

Além disso, isso é óbvio se você souber como os ponteiros funcionam em C, mas pode ser surpreendente se você não:

Você pode pensar que a atribuição a (--i)[arr]gera um erro, mas é válida e equivalente a arr[--i]. Uma expressão a[x]é apenas açúcar sintático para o *(a + x)qual calcula e desreferencia o ponteiro para o elemento indexado; a adição é, naturalmente, comutativa e, portanto, equivalente a *(x + a).

l4mpi
fonte
11
Tanto quanto posso ver, o corpo do loop nunca deve ser executado (porque 1234 <= 0 é avaliado como falso). Você possivelmente quis escrever "> ="?
Celtschk 7/03/14
11
@celtschk sim, isso foi um erro de digitação. Obrigado por perceber!
L4mpi
Esse alinhamento de memória é realmente especificado ou apenas implementado dessa maneira em alguns compiladores?
Paŭlo Ebermann 9/09/15
9

Java

public class WhatTheHeckException extends RuntimeException {
    private static double d;        // Uninitialized variable
    public static void main(String... args) {
        if (d/d==d/d) throw new WhatTheHeckException();
        // Well that should always be true right? == is reflexive!

        System.out.println("Nothing to see here...");
    }
}

Por que isso funciona:

Os campos unitizados têm valores padrão. Nesse caso, d é apenas 0 . 0/0 = NaN em divisão dupla, e NaN nunca é igual a si próprio, portanto o if retorna false. Observe que isso não funcionaria se você tivesse 0/0 == 0/0 , pois em seria a divisão de número inteiro 0/0 lançaria uma ArithmeticException .

durron597
fonte
8

C ++ 11

struct comp {
    comp operator compl () { return comp { }; }
    operator comp () { return comp { }; }
    compl comp () { return; comp { }; }
};

int main() {
    comp com;
    compl com;
}

Compila e executa sem nenhum aviso com g++ -pedantic-errors -std=c++11.

complé uma ortografia alternativa padrão para ~, assim como noté uma alternativa para !. complé usado aqui para substituir primeiro operator~e depois definir um destruidor. Outro truque é que operator compé uma função de conversão do tipo comppara ele mesmo. Surpreendentemente, o padrão não proíbe tal função de conversão - mas diz que essa função nunca é usada.

han
fonte
8

VBScript

function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")

'Output: :)

O que faz:

Nomes de funções, sub e variáveis ​​no VBScript podem ser qualquer coisa se você usar colchetes. Esse script cria uma função chamada :(e um argumento, "):"mas como eles não seguem a convenção de nomenclatura normal, eles são cercados por colchetes. O valor de retorno é definido como o valor do parâmetro. Um cólon adicional é usado para colocar tudo em uma linha. A instrução Msgbox obtém uma referência à função (mas não precisa dos colchetes) e a chama com um smiley :)como parâmetro.

AutomatedChaos
fonte
11
Tantas caras carrancudas :(
Joe Z.
8

C #

Na verdade, eu peguei por engano fazer exatamente isso :)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

jogue , não volte .

Spook
fonte
Haha, bem-vindo ao site! Parabéns pela bravura disso como um primeiro post. :)
Jonathan Van Matre
7

Java

enum derp
{

    public static void main(String[] a)
    {
        System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
    }
}

E como isso funciona:

Primeiro, você acha que o Enum não é válido, mas é válido; então você acha que ele imprimirá atributos padrão de objetos Point, mas Gotcha! devido a como o Snakeyaml serializa, você obtém um erro suave do StackOverFLow

E um outro:

enum derp
{

    ;public static void main(String[] a)
    {
        main(a);
    }
    static int x = 1;

    static
    {
        System.exit(x);
    }
}

você acha que um Stackoverflow ocorrerá devido à recursão óbvia, mas o programa abusa do fato de que quando você o executa, ele static{} blockserá executado primeiro e devido ao fato de ele sair antes do carregamento principal ()

enum derp
{

    ;
        public static void main(
            String[] a)
    {
        int aa=1;
        int ab=0x000d;
        //setting integer ab to \u000d  /*)
        ab=0;

        /*Error!*/
        aa/=ab;
    }
    static int x = 1;
}

este se baseia no /*Error*/código comentado como ponto de fechamento do comentário aberto antes do ab = 0; a explicação sobre o número inteiro ab a 0x000d oculta a nova linha para ativar o comentário da próxima linha

masterX244
fonte
11
Não posso agora, mas seria bom se você reformatasse isso, se possível. É um pouco difícil de ler como é ...: P
Jwosty
os tornou mais óbvios; e etiquetas do spoiler são destinados causa os truques Arent óbvio à primeira vista
masterX244
2
Espere, para que o primeiro produz, de fato, um erro? É o oposto do que a pergunta está fazendo. E por que não apenas System.exit (1) no segundo?
Riking
3
Nenhum programador java esperaria um estouro de pilha no segundo trecho. Desculpe, isso é óbvio demais.
Tobias
11
@VVK codegolfing hábito de usar enum{, em vez de class{salva um byte então
masterX244
6

C

Strings e matrizes em c podem ser bastante confusas

main(){
  int i=0;
  char string[64]="Hello world;H%s";
  while(strlen(&i++[string])){
    i[' '+string]=string[i]-' ';
  }
  5[string]=44;
  return printf(string,'!'+string);
}
orion
fonte
9
é difícil de ler, mas eu não sei que tipo de pessoas de erro estão esperando a partir deste
Bryan Chen
3
Eu só queria lembrar as pessoas de notação válida, mas não convencional - faça do que você quiser. Eu certamente procuraria três vezes antes de dizer que isso é válido. Antes de tudo, expressões como 5 [string] não são bem conhecidas por um codificador casual e desafiam a lógica da indexação de array. Em segundo lugar, '' + string parece adicionar duas strings, mas com tipos de aspas incorretos. E terceiro, o & i ++ parece o endereço de um número inteiro (mas a precedência cuida disso). Finalmente, estamos escrevendo além do literal da string (mas não além do buffer de backup maior).
orion
Não parece tão ruim. Eu apenas codifiquei um pouco em C ++, mas posso descobrir isso.
Navin