2013-04-01 16 views
286

natknąłem następującym programem, który kompiluje bez błędów czy nawet ostrzeżeń:Co to za uśmiech z brodą: "<:]{%>"?

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

Live example.

Co ma zrobić program, a co to jest wyrażenie buźkę?

+43

dałem coś wzdłuż tych linii do klasy programowania jako bonus. Jestem zły, wiem. Jest bardzo niezauważalny w Google. – chris

+56

Ładne opowiadanie; Słyszałem, że pozwieją cię za powiedzenie "nieobsługiwalne". – matt

+3

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

Odpowiedz

285

To pusty lambda przy użyciu przeźroczowania digraficznego. Normalne lambdy nie mają brody.

346

Program korzysta digraphs reprezentować następujące:

[] {}; 

Jest to wyrażenie lambda, że ​​nic nie robi. Odpowiednie symbole mają następujące odpowiedniki:

<: = [ 
%> = } 

Choć generalnie są one niepotrzebne dziś digrafów są użyteczne, gdy klawiatura brakuje niektórych kluczy niezbędnych do korzystania z podstawowych zestaw znaków źródło C++ 's, a mianowicie te, graficzne. Kombinacja znaków tworzących dwuznak jest przetwarzana jako pojedynczy token. To z kolei rekompensuje każdą niedostatecznie wyposażoną klawiaturę lub inny taki sprzęt lub oprogramowanie.

60

Program używa digraphs, który umożliwia programowanie w C++ za pomocą klawiatur (lub kodowań tekstowych), które mogą nie mieć znaków typowych dla języka C++.

Kod postanawia to:

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

Jest to w zasadzie Lambda expression (wyrażenie lambda jest jednym z C++11 funkcji) za pomocą digraphs (zarówno digrafy i trójznaków działa na C++):

[] {}; 

Korzystanie tylko z wykopów raphs:

<:]<%}; 

<:]<%%>; 

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

[:><%}; 

[:><%%>; 

mieszanie ich z trójznaków:

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

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