2013-04-01 12 views
286

stieß ich auf das folgende Programm, das ohne Fehler oder sogar Warnungen kompiliert:Was ist dieser Smiley-mit-Bart-Ausdruck: "<:]{%>"?

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

Live example.

Was macht das Programm zu tun, und was ist das Smiley-Ausdruck?

+43

gab ich etwas in dieser Richtung zu einer Programmier Klasse als Bonus. Ich bin böse, ich weiß. Es ist auf Google sehr unerforschlich. – chris

+56

Schöne Umschreibung; Ich habe gehört, dass sie dich verklagen, weil sie "unsegabel" gesagt haben. – matt

+3

@matt Sie verklagt sweeden: http://www.bbc.com/news/magazine-21956743 – Edward

Antwort

285

Das ist ein leeres Lambda mit einer Digraph-Verkleidung. Normale Lambdas haben keine Bärte.

346

Das Programm verwendet digraphs folgendes dar:

[] {}; 

Dies ist ein Lambda-Ausdruck, der nichts tut. Die entsprechenden Symbole haben diese Äquivalente:

<: = [ 
%> = } 

Obwohl sie heute in der Regel nicht benötigt sind, Digraphen sind nützlich, wenn die Tastatur fehlt bestimmte Tasten notwendig C++ 's grundlegenden Quelle Zeichensatz, nämlich die grafisch diejenigen zu verwenden. Die Kombination der Zeichen, aus denen ein Digraph besteht, wird als einzelner Token verarbeitet. Dies wiederum ersetzt nicht ausreichend ausgestattete Tastaturen oder andere derartige Hardware oder Software.

60

Das Programm verwendet digraphs, die C++ - Programmierung mit Tastaturen (oder Textkodierungen) ermöglichen, die möglicherweise nicht die Zeichen verwenden, die C++ normalerweise verwendet.

Der Code löst dazu:

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

Es ist im Grunde ein Lambda expression (Lambda Ausdruck eines von C++11 Merkmale) digraphs (beide Digraphe und trigraphs arbeitet auf C++):

[] {}; 

Nur mit dig raphs:

<:]<%}; 

<:]<%%>; 

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

[:><%}; 

[:><%%>; 

sie mit Trigraphen Mischen:

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

??(:>{??>; // pirate