Was ist dieser Ausdruck mit Smiley und Bart: "<:] {%>"?

300

Ich bin auf folgendes Programm gestoßen, das ohne Fehler oder Warnungen kompiliert wird:

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

Live Beispiel.

Was macht das Programm und was ist dieser Smiley-Ausdruck?

Xeo
quelle
44
Als Bonus habe ich einer Programmierklasse etwas in diese Richtung gegeben. Ich bin böse, ich weiß. Es ist bei Google sehr unerforschlich.
Chris
57
Schöne Umschreibung; Ich höre, sie verklagen dich, weil du "unaussprechlich" gesagt hast.
Matt
3
@ Matt Sie verklagten Schweden: bbc.com/news/magazine-21956743
Edward
2
Würden Sie bitte in Betracht ziehen, die akzeptierte Antwort zu ändern?
nhahtdh
4
@Mysticial: Lustige Antworten machen Spaß, aber am Ende des Tages hilft es den Lesern nicht wirklich.
nhahtdh

Antworten:

292

Das ist ein leeres Lambda mit einer Digraphenverkleidung. Normale Lambdas haben keinen Bart.

R. Martinho Fernandes
quelle
354

Das Programm verwendet Digraphen , um Folgendes darzustellen:

[] {};

Dies ist ein Lambda-Ausdruck, der nichts tut. Die entsprechenden Symbole haben folgende Entsprechungen:

<: = [
%> = }

Obwohl sie heutzutage im Allgemeinen nicht mehr benötigt werden, sind Digraphen nützlich, wenn auf Ihrer Tastatur bestimmte Tasten fehlen, die für die Verwendung des grundlegenden Quellzeichensatzes von C ++ erforderlich sind, nämlich die grafischen. Die Kombination der Zeichen, aus denen ein Digraph besteht, wird als einzelnes Token verarbeitet. Dies gleicht wiederum unzureichend ausgestattete Tastaturen oder andere solche Hardware oder Software aus.

0x499602D2
quelle
66

Das Programm verwendet Digraphen , die die C ++ - Programmierung mit Tastaturen (oder Textcodierungen) ermöglichen, die möglicherweise nicht die Zeichen enthalten, die C ++ normalerweise verwendet.

Der Code löst sich folgendermaßen auf:

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

Es handelt sich im Grunde genommen um einen Lambda-Ausdruck (Lambda-Ausdruck ist eine der Funktionen von C ++ 11 ), der Digraphen verwendet (sowohl Digraphen als auch Trigraphen funktionieren unter C ++):

[] {};

Verwenden Sie nur Digraphen:

<:]<%}; 

<:]<%%>;

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

[:><%};

[:><%%>;

Mischen mit Trigraphen:

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

??(:>{??>; // pirate
Khaled.K
quelle