Saya melihat garis C yang tampak seperti ini:
!ErrorHasOccured() ??!??! HandleError();
Itu dikompilasi dengan benar dan tampaknya berjalan ok. Sepertinya memeriksa apakah ada kesalahan, dan jika ada, itu menanganinya. Tetapi saya tidak begitu yakin apa yang sebenarnya dilakukan atau bagaimana melakukannya. Tampaknya programmer mencoba mengekspresikan perasaan mereka tentang kesalahan.
Saya belum pernah melihat ??!??!
sebelumnya dalam bahasa pemrograman apa pun, dan saya tidak dapat menemukan dokumentasi untuk itu di mana pun. (Google tidak membantu dengan istilah pencarian seperti ??!??!
). Apa fungsinya dan bagaimana contoh kode bekerja?
!ErrorHasOccurred() ??!???! HandleError();
untuk mengkompilasi? Itu??!
???
!
. Buktikan intinya?ErrorHasOccured() && HandleError()
diri saya sendiri. Itu juga bagaimana Lua melakukannya.Jawaban:
??!
adalah trigraph yang diterjemahkan menjadi|
. Jadi katanya:yang, karena hubungan arus pendek, setara dengan:
Guru Minggu Ini (berurusan dengan C ++ tetapi relevan di sini), tempat saya mengambilnya.
Kemungkinan asal trigraph atau seperti @DwB tunjukkan dalam komentar itu lebih mungkin karena EBCDIC menjadi sulit (lagi). Ini diskusi di papan IBM developerWorks tampaknya mendukung teori itu.
Dari ISO / IEC 9899: 1999 §5.2.1.1, catatan kaki 12 (h / t @ Random832):
sumber
if (ErrorHasOccured()) HandleError()
. Untungnya Anda biasanya hanya menemukan idiom ini dalam kode perl.ErrorHasOccurred() && HandleError();
adalah Yaitu, jika Anda terbiasa dengan shell scripting. :)Nah, mengapa ini ada secara umum mungkin berbeda dari mengapa itu ada dalam contoh Anda.
Semuanya dimulai setengah abad yang lalu dengan repurposing terminal komunikasi hardcopy sebagai antarmuka pengguna komputer. Pada era awal Unix dan C itu adalah ASR-33 Teletype.
Perangkat ini lambat (10 cps) dan berisik dan jelek dan pandangannya tentang set karakter ASCII berakhir pada 0x5f, jadi itu (perhatikan gambar) tidak ada tombol:
Trigraphs didefinisikan untuk memperbaiki masalah tertentu. Idenya adalah bahwa program C dapat menggunakan subset ASCII yang ditemukan pada ASR-33 dan di lingkungan lain kehilangan nilai ASCII yang tinggi.
Namun, orang yang menulis kode C hampir secara definisi memiliki peralatan modern, 1 jadi dugaan saya adalah: seseorang memamerkan atau menghibur diri mereka sendiri, meninggalkan semacam telur Paskah dalam kode untuk Anda temukan.
Itu pasti berhasil, itu mengarah ke pertanyaan SO sangat populer.
ASR-33 Teletype
1. Dalam hal ini, trigraph ditemukan oleh komite ANSI, yang pertama kali bertemu setelah C menjadi sukses besar, sehingga tidak ada kode C atau coders asli yang akan menggunakannya.
sumber
#
diganti dengan£
. Di wilayah lain, mungkin "ASCII" tidak punya kawat gigi, dll.if (x || y) { a[i] = '\0'; }
terlihat sepertiif (x öö y) ä aÄiÅ = 'Ö0'; å
di charset yang salah.Ini adalah C trigraph .
??!
adalah|
, begitu??!??!
juga operator||
sumber
<iso646.h>
file header.Seperti yang sudah dinyatakan
??!??!
pada dasarnya adalah dua trigraph (??!
dan??!
lagi) disatukan yang diganti-diterjemahkan menjadi||
, yaitu logika OR , oleh preprocessor.Tabel berikut ini berisi setiap trigraph akan membantu menyatukan kombinasi trigraph alternatif:
Sumber: C: A Reference Manual Edisi ke-5
Jadi sebuah trigraph yang kelihatannya
??(??)
pada akhirnya akan dipetakan ke[]
,??(??)??(??)
akan digantikan oleh[][]
dan seterusnya, Anda mendapatkan idenya.Karena trigraph diganti selama preprocessing, Anda dapat menggunakan
cpp
untuk melihat sendiri hasilnya, menggunakantrigr.c
program konyol :dan memprosesnya dengan:
Anda akan mendapatkan output konsol sebesar
Seperti yang dapat Anda perhatikan, opsi
-trigraphs
harus ditentukan atau yang laincpp
akan mengeluarkan peringatan; ini menunjukkan caranya trigraph adalah sesuatu dari masa lalu dan tidak memiliki nilai modern selain membingungkan orang yang mungkin menabrak mereka .Adapun alasan di balik pengenalan trigraph, lebih baik dipahami ketika melihat bagian sejarah ISO / IEC 646 :
(penekanan milikku)
Jadi, pada dasarnya, beberapa karakter yang diperlukan (yang ada trigraph ada) diganti dalam varian nasional tertentu. Ini mengarah pada representasi alternatif menggunakan trigraph yang terdiri dari karakter yang masih dimiliki oleh varian lain.
sumber