O que é essa expressão de sorriso com barba: "<:] {%>"?


300

Me deparei com o seguinte programa, que compila sem erros ou mesmo avisos:

int main(){
  <:]{%>; // smile!
}

Exemplo ao vivo.

O que o programa faz e qual é essa expressão sorridente?


44
Dei algo nesse sentido a uma aula de programação como um bônus. Eu sou mau, eu sei. É muito insondável no Google.
quer

57
Circunlocução agradável; Ouvi dizer que eles o processam por dizer "inominável".
matt

3
@matt Eles processaram a Suécia: bbc.com/news/magazine-21956743
Edward

2
Você poderia alterar a resposta aceita?
N

4
@Mysticial: Respostas divertidas são divertidas, mas no final do dia, isso realmente não ajuda os leitores.
Nhahtdh

Respostas:



354

O programa usa dígrafos para representar o seguinte:

[] {};

Esta é uma expressão lambda que não faz nada. Os símbolos correspondentes têm estes equivalentes:

<: = [
%> = }

Embora eles geralmente sejam desnecessários hoje em dia, os digrafos são úteis quando o teclado não possui certas teclas necessárias para usar o conjunto de caracteres de origem básico do C ++, ou seja, os gráficos. A combinação dos caracteres que compõem um dígrafo é processada como um único token. Isso, por sua vez, compensa os teclados insuficientemente equipados ou outro tipo de hardware ou software.


66

O programa está usando dígitos , que permitem a programação C ++ com teclados (ou codificações de texto) que podem não ter os caracteres que o C ++ normalmente usa.

O código resolve isso:

int main(){
  []{}; // smile!
}

61
int main(){
  <:]{%>; // smile!
}

É basicamente uma expressão Lambda (a expressão Lambda é um dos recursos do C ++ 11 ) usando digrafos (ambos os digrafos e trigramas funcionam em C ++):

[] {};

Usando apenas dígrafos:

<:]<%}; 

<:]<%%>;

[:>{%>; // like my cubic hat?

[:><%};

[:><%%>;

Misturando-os com Trigraphs:

<:??)<%??>; // popeye

??(:>{??>; // pirate
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.