2013-04-01 26 views
286

Tôi đã xem qua các chương trình sau đây, trong đó biên dịch mà không có lỗi hoặc thậm chí cảnh báo:Biểu thức mặt cười có râu này: "<:]{%>" là gì?

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

Live example.

hiện chương trình làm gì, và những gì mà cười thể hiện là gì?

+43

Tôi đưa cho một cái gì đó dọc theo những dòng này vào một lớp học lập trình như một phần thưởng. Tôi là ác, tôi biết. Nó rất không thể tìm kiếm trên Google. – chris

+56

Đẹp circumlocution; Tôi nghe họ kiện bạn vì nói "không thể giải quyết". – matt

+3

@matt Họ đã kiện thay thế: http://www.bbc.com/news/magazine-21956743 – Edward

Trả lời

285

Đó là một lambda rỗng bằng cách sử dụng một ngụy trang digraph. Lambdas bình thường không có râu.

346

Chương trình sử dụng digraphs để đại diện cho những điều sau đây:

[] {}; 

Đây là một biểu thức lambda mà không làm gì. Các biểu tượng tương ứng có những tương đương:

<: = [ 
%> = } 

Mặc dù họ nói chung là không cần thiết ngày hôm nay, chữ ghép này rất hữu ích khi bàn phím của bạn thiếu một số phím cần thiết để sử dụng cơ bản bộ ký tự nguồn C++ 's, cụ thể là những đồ họa. Sự kết hợp của các ký tự tạo nên một digraph được xử lý như một mã thông báo duy nhất. Điều này lần lượt bù đắp cho bất kỳ bàn phím không được trang bị đầy đủ hoặc phần cứng hoặc phần mềm khác.

60

Chương trình đang sử dụng digraphs, cho phép lập trình C++ với bàn phím (hoặc mã hóa văn bản) có thể không có các ký tự C++ thường sử dụng.

Mã này giải quyết như sau:

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

Đó là cơ bản một Lambda expression (Lambda expression là một trong những C++11 tính năng) sử dụng digraphs (cả chữ ghép và trigraphs hoạt động trên C++):

[] {}; 

Chỉ sử dụng chức năng đào raphs:

<:]<%}; 

<:]<%%>; 

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

[:><%}; 

[:><%%>; 

Trộn chúng với Trigraphs:

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

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