Ich bin auf folgendes Programm gestoßen, das ohne Fehler oder Warnungen kompiliert wird:
int main(){
<:]{%>; // smile!
}
Was macht das Programm und was ist dieser Smiley-Ausdruck?
Ich bin auf folgendes Programm gestoßen, das ohne Fehler oder Warnungen kompiliert wird:
int main(){
<:]{%>; // smile!
}
Was macht das Programm und was ist dieser Smiley-Ausdruck?
Antworten:
Das ist ein leeres Lambda mit einer Digraphenverkleidung. Normale Lambdas haben keinen Bart.
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.
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!
}
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