Saya menemukan program berikut, yang mengkompilasi tanpa kesalahan atau bahkan peringatan:
int main(){
<:]{%>; // smile!
}
Apa yang dilakukan program, dan apa itu ekspresi smiley?
Saya menemukan program berikut, yang mengkompilasi tanpa kesalahan atau bahkan peringatan:
int main(){
<:]{%>; // smile!
}
Apa yang dilakukan program, dan apa itu ekspresi smiley?
Jawaban:
Itu lambda kosong menggunakan penyamaran digraf. Lambda yang normal tidak memiliki jenggot.
Program ini menggunakan digraf untuk mewakili yang berikut:
[] {};
Ini adalah ekspresi lambda yang tidak melakukan apa-apa. Simbol yang sesuai memiliki persamaan ini:
<: = [
%> = }
Meskipun mereka umumnya tidak dibutuhkan hari ini, digraf berguna untuk saat keyboard Anda tidak memiliki tombol tertentu yang diperlukan untuk menggunakan set karakter sumber dasar C ++, yaitu yang grafis. Kombinasi karakter yang membentuk digraf diproses sebagai token tunggal. Pada gilirannya, ini menggantikan keyboard yang tidak lengkap atau perangkat keras atau perangkat lunak lainnya.
Program ini menggunakan digraf , yang memungkinkan pemrograman C ++ dengan keyboard (atau penyandian teks) yang mungkin tidak memiliki karakter yang biasanya digunakan C ++.
Kode mengatasi ini:
int main(){
[]{}; // smile!
}
int main(){ <:]{%>; // smile! }
Ini pada dasarnya adalah ekspresi Lambda ( ekspresi Lambda adalah salah satu fitur C ++ 11 ) menggunakan digraf (baik digraf dan trigraph berfungsi pada C ++):
[] {};
Hanya menggunakan digraf:
<:]<%};
<:]<%%>;
[:>{%>; // like my cubic hat?
[:><%};
[:><%%>;
Mencampurnya dengan Trigraphs:
<:??)<%??>; // popeye
??(:>{??>; // pirate