Qual é, na sua opinião, o recurso de linguagem mais surpreendente, estranho, estranho ou realmente "WTF" que você encontrou?
Por favor, apenas um recurso por resposta.
language-agnostic
programming-languages
Robert Harvey
fonte
fonte
Respostas:
Em C, matrizes podem ser indexadas da seguinte forma:
o que é muito comum.
No entanto, a forma menos conhecida (que realmente funciona!) É:
o que significa o mesmo que o acima.
fonte
Em JavaScript:
Enquanto que
fonte
+
para concatenação é horrívelEm JavaScript, a construção a seguir
retornaé um erro de sintaxe devido à inserção de ponto e vírgula implícita furtiva na nova linha posteriorundefined
return
. O seguinte funciona como seria de esperar:Pior ainda, este também funciona (no Chrome, pelo menos):
Aqui está uma variante do mesmo problema que não gera um erro de sintaxe, mas falha silenciosamente:
fonte
Tabela de verdade do JavaScript:
fonte
==
serve aos olhos do designer de idiomas?==
tivesse o significado de===
, e então houvesse outro operador, algo assim~=
permitido coerção de tipo.Trígrafos em C e C ++.
Isso será impresso
LOL|
, porque o trigrafo??!
é convertido em|
.fonte
Diversão com o boxe automático e o cache inteiro em Java:
Explicação
Uma rápida olhada no código-fonte Java exibirá o seguinte:
Nota: o
IntegerCache.high
padrão é a127
menos que definido por uma propriedade.O que acontece com o boxing automático é que foo e bar o mesmo objeto inteiro recuperado do cache, a menos que seja explicitamente criado: por exemplo
foo = new Integer(42)
, portanto, ao comparar a igualdade de referência, elas serão verdadeiras e não falsas. A maneira correta de comparar o valor inteiro é usando.equals;
fonte
Citando Neil Fraser (veja o final dessa página),
(em Java, mas o comportamento é aparentemente o mesmo em JavaScript e Python). O resultado é deixado como um exercício para o leitor.
EDITADO: Enquanto estivermos no assunto, considere também o seguinte:
fonte
Control cannot leave the body of a finally clause
return
nafinally
cláusula.APL (exceto ALL), a capacidade de escrever qualquer programa em apenas uma linha.
por exemplo , Jogo da Vida de Conway em uma linha no APL :
texto alternativo http://catpad.net/michael/APLLife.gif
Se essa linha não for WTF, nada será!
E aqui está um vídeo
fonte
As coisas estranhas que os modelos C ++ podem ser usados, melhor demonstradas pelos "Literais analógicos multidimensionais", que usam modelos para calcular a área de formas "desenhadas". O código a seguir é válido em C ++ para um retângulo 3x3
Ou outro exemplo com um cubo 3D:
fonte
Muitas variáveis internas do Perl:
$#
- não é um comentário!$0
,,$$
e$?
- assim como as variáveis de shell com o mesmo nome$ˋ
,$&
E$'
- variáveis de captura estranhas$"
e$,
- variáveis estranhas para separadores de campos de lista e saída$!
- comoerrno
um número, masstrerror(errno)
como uma string$_
- a variável stealth, sempre usada e nunca vista$#_
- número do índice do último argumento da sub-rotina ... talvez@_
- os nomes (não) da função atual ... talvez$@
- a última exceção levantada%::
- a tabela de símbolos$:
,$^
,$~
,$-
, E$=
- algo a ver com formatos de saída$.
e$%
- número da linha de entrada, número da página de saída$/
e$\
- separadores de registros de entrada e saída$|
- controlador de buffer de saída$[
- mude sua base de array de 0 para 1 e 42: WHEEE!$}
- nada, curiosamente!$<
,$>
,$(
,$)
- UIDs e GIDs reais e efetivos@ISA
- nomes das superclasses diretas do pacote atual$^T
- tempo de inicialização do script em segundos$^O
- nome atual do sistema operacional$^V
- qual é a versão do PerlHá muito mais de onde eles vieram. Leia a lista completa aqui .
fonte
$[
variável é a mais má de todas.perldoc perlvar
cada cinco segundos. (Embora eu confesso que metade do tempo eu verificá-lo pensando: "Eu sei que há uma variável especial que pode fazer isso por mim, eu não lembro qual ..." = P)use English;
é que isso afeta o desempenho do RegExp. Eu não estou inventando isso. perldoc.perl.org/English.html#PERFORMANCE/$foo[bar]/
, em , a[bar]
parte é uma classe de caracteres ou um subscrito para a matriz@foo
? Grep perldata pela resposta terrível.Manipulação do PHP de valores numéricos em strings . Veja esta resposta anterior a uma pergunta diferente para obter detalhes completos, mas, resumindo:
Se você tiver duas cadeias que contêm um número diferente de caracteres, elas não poderão ser consideradas iguais. Os zeros à esquerda são importantes porque são cadeias e não números.
PHP não gosta de strings. Ele está procurando qualquer desculpa que possa encontrar para tratar seus valores como números. Altere os caracteres hexadecimais nessas cadeias um pouco e de repente o PHP decide que não são mais cadeias, são números em notação científica (o PHP não se importa que você tenha usado aspas) e são equivalentes porque zeros à esquerda são ignorados por números. Para reforçar esse ponto, você descobrirá que o PHP também é avaliado
"01e4" == "10000"
como verdadeiro porque esses são números com valores equivalentes. Esse é um comportamento documentado, mas não é muito sensato.fonte
Vamos votar em todos os idiomas (como PL / I) que tentaram eliminar as palavras reservadas.
Onde mais você poderia legalmente escrever expressões divertidas como:
(
IF
,THEN
,ELSE
São nomes de variáveis)ou
(
IF
é uma variávelTHEN
eELSE
são sub-rotinas)fonte
O 'recurso' de conversão octal do JavaScript é bom para saber sobre:
Mais detalhes aqui .
fonte
O dispositivo de Duff em C!
Em C, pode-se entrelaçar um fazer / enquanto com uma instrução switch. Aqui está um exemplo de um memcpy usando este método:
fonte
while
, o final é umJMP
retorno (condicional) para odo
, o que explica por que você pode pular o arquivodo
e ainda assim acabar no loop.Passe Algol por nome (ilustrado usando a sintaxe C):
fonte
def f(j : => int)
)... template<typename T> struct by_name { virtual operator T&() = 0; }; void f(by_name<int> j) { ... } int main() { f(struct : by_name<int> { operator int&() { return a[i]; } }); }
?Em Python:
Não é um WTF, mas um recurso útil.
fonte
(10 > 5 > 1) != ((10 > 5) > 1)
em Python.(funct_a(5)+5 > b > funct_a(5))
apenas chamafunct_a(5)
uma vez. É um ótimo recurso!funct_a
será chamado duas vezes nesse exemplo. Emb > funct_a(5) > c
ela só vai ser chamado uma vez que, ao contráriob > funct_a(5) and funct_a(5) > c
.Em Java:
Pode ser escrito como:
fonte
const T*
eT const*
são equivalentes, é issoT* const
que consome o ponteiro. Além disso, eu odeio fontes sem.numbers()[2]
é uma declaração legal.INTERCAL é provavelmente o melhor compêndio de recursos linguísticos mais estranhos. Meu favorito pessoal é a declaração COMEFROM , que é (quase) o oposto do GOTO.
fonte
PLEASE
modificador com bastante frequência!Não é realmente um recurso de linguagem, mas uma falha de implementação: alguns compiladores anteriores do Fortran implementaram constantes usando um pool constante. Todos os parâmetros foram passados por referência. Se você chamou uma função, por exemplo
O compilador passaria o endereço da constante 1 no pool constante para a função. Se você atribuiu um valor ao parâmetro na função, alteraria o valor (neste caso, o valor de 1) globalmente no programa. Causou algum coçar a cabeça.
fonte
2+2
pode ser igual5
(para valores muito grandes, é2
claro!).2+2
seria igual5
para valores pequenos de5
).2 + 2 = 5
; isso será um erro de sintaxe. O que será verdade é2 + 2 .EQ. 5
.Não sei se ele pode ser considerado um recurso de linguagem, mas em C ++ quase qualquer erro de compilador relacionado a modelos fornece uma quantidade razoável de WTF para muitos programadores de C ++ diariamente em todo o mundo :)
fonte
std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::vector< std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator>(std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::allocator<std::pair<int, std::complex> >)
Os muitos espaços de nomes de C:
Ou com caracteres:
fonte
Eu diria que todo o espaço em branco do Python é o meu maior recurso WTF. É verdade que você se acostuma mais ou menos com isso depois de um tempo e os editores modernos facilitam o tratamento, mas mesmo depois do desenvolvimento de python em tempo integral no ano passado, ainda estou convencido de que foi uma má ideia. Eu li todo o raciocínio por trás disso, mas honestamente, isso atrapalha minha produtividade. Não muito, mas ainda é uma rebarba debaixo da sela.
editar: a julgar pelos comentários, algumas pessoas parecem pensar que eu não gosto de recuar meu código. Essa é uma avaliação incorreta. Eu sempre recuei meu código, não importa qual idioma e se sou forçado ou não. O que eu não gosto é que é o recuo que define em que bloco uma linha de código está. Prefiro delimitadores explícitos para isso. Entre outras razões, acho que delimitadores explícitos facilitam a recortar e colar o código.
Por exemplo, se eu tiver um bloco com quatro espaços recuados e colá-lo no final de um bloco com oito espaços recuados, meu editor (todos os editores?) Não faz ideia se o código colado pertence ao bloco de 8 espaços ou ao espaço externo quadra. OTOH, se eu tenho delimitadores explícitos, é óbvio a qual bloco o código pertence e como deve ser (re) indentado - ele o faz procurando inteligentemente por delimitadores de bloco.
edit 2: algumas pessoas que fazem comentários parecem pensar que esse é um recurso que odeio ou que faz do python uma linguagem ruim. Novamente, não é verdade. Embora eu não goste muito, isso não vem ao caso. A questão é sobre o recurso de idioma mais estranho , e acho isso estranho, por ser algo que muito, muito poucas (mas> 0) as linguagens usam.
fonte
Eu lutei um pouco sobre isso:
No perl, os módulos precisam retornar algo verdadeiro .
fonte
'Cogito ergo sum';
que, como todos sabem, é evidentemente verdadeiro em todos os universos possíveis. Isso garante a máxima portabilidade".<?=1;?>
retorna 1.<?=true;?>
retorna 1.<?=false;?>
retorna nulo.Estou surpreso que ninguém tenha mencionado as construções de loop de 7 do Visual Basic .
Porque furando um! na frente de sua condicional é maneira muito complicado!
fonte
While
eWhend
", já que algumas pessoas pronunciam a palavra "enquanto" com o velar labializado sem voz aproximadamente. E é claro que ele se alinha melhor, e o código que se alinha é bom.Para quem não sabe,
bc
é uma "linguagem arbitrária da calculadora de precisão", e eu a uso com frequência para cálculos rápidos, principalmente quando os números envolvidos são grandes ($
é o prompt):bc
tem sido um comando padrão do Unix há muito tempo.Agora, para o "recurso WTF". Isto é de
man bc
(ênfase minha):fonte
bc
antes disso e queria escreverbc
no meu post por causa das ótimas citações da página de manual.echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
(embora você já deva saber disso).Eu sempre me perguntei por que o programa mais simples era:
Considerando que poderia ser:
Talvez isso seja para assustar os estudantes de ciência da computação em primeiro lugar ...
fonte
JavaScript é orientado a objetos, certo? Portanto, os métodos em execução em strings e números literais devem funcionar. Como
"hello".toUpperCase()
e3.toString()
. Acontece que o segundo é um erro de sintaxe, por quê? Como o analisador espera que um número seguido de um ponto seja um literal de ponto flutuante. Esse não é o WTF, o WTF é que você só precisa adicionar outro ponto para fazê-lo funcionar:A razão é que o literal
3.
é interpretado como3.0
e3.0.toString()
funciona bem.fonte
3..__add__(4)
). Então, novamente eu acho que(3).__add__(4)
é uma forma menos muito cérebro danificado para fazê-lo :)3.0.toString()
faz meus olhos coçarem.Em JavaScript:
Felizmente, o pessoal do stackoverflow.com me explicou tudo: Por que 2 == [2] em JavaScript?
fonte
===
.Number(n)
para fazer algo semelhante. Infelizmente, em ambas as nossas soluções, as===
quebras = (.Meu maior recurso mais odiado é qualquer sintaxe de arquivo de configuração que inclua lógica condicional. Esse tipo de coisa é comum no mundo Java (Ant, Maven, etc. Você sabe quem é!).
Você acaba programando em linguagem AC ** P, com depuração limitada e suporte limitado ao editor.
Se você precisar de lógica em sua configuração, a abordagem "Pythonic" de codificar a configuração em uma linguagem real é muito melhor.
fonte
O powerbasic (www.powerbasic.com) inclui a diretiva do compilador:
isso aumenta o tamanho do executável compilado em
<bloatsize>
bytes. isso foi colocado no compilador caso as pessoas que criam o executável não gostem do tamanho pequeno do executável gerado. faz o EXE parecer maior para competir com as linguagens de programação inchadas :)fonte