Pertanyaan Apa artinya C ??! ??! operator lakukan?


Saya melihat garis C yang terlihat seperti ini:

!ErrorHasOccured() ??!??! HandleError();

Ini dikompilasi dengan benar dan tampaknya berjalan baik. Sepertinya itu memeriksa apakah kesalahan telah terjadi, dan jika itu terjadi, ia akan menanganinya. Tapi saya tidak begitu yakin apa yang sebenarnya sedang dilakukan atau bagaimana melakukannya. Sepertinya programmer mencoba mengungkapkan perasaan mereka tentang kesalahan.

Saya belum pernah melihat ??!??! sebelumnya dalam bahasa pemrograman apa pun, dan saya tidak dapat menemukan dokumentasi untuk itu di mana saja. (Google tidak membantu dengan istilah pencarian seperti ??!??!). Apa fungsinya dan bagaimana cara kerja contoh kode?


1603
2017-10-19 16:56


asal


Jawaban:


??! adalah trigraph yang diterjemahkan menjadi |. Jadi dikatakan:

!ErrorHasOccured() || HandleError();

yang, karena korsleting, setara dengan:

if (ErrorHasOccured())
    HandleError();

Guru Pekan Ini (berurusan dengan C ++ tetapi relevan di sini), di mana saya mengambil ini.

Kemungkinan asal-usul trigraphs atau seperti yang ditunjukkan oleh @DwB di komentar, kemungkinan besar karena EBCDIC menjadi sulit (lagi). Ini diskusi di dewan pengembang IBM tampaknya mendukung teori itu.

Dari ISO / IEC 9899: 1999 §5.2.1.1, catatan kaki 12 (h / t @ Random832):

Urutan trigraph memungkinkan input karakter yang tidak didefinisikan dalam Set Kode Invarian sebagai   dijelaskan dalam ISO / IEC 646, yang merupakan bagian dari set kode ASCII tujuh-bit AS.


1319
2017-10-19 16:58



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 awal era Unix dan C itu adalah ASET-33 Teletype.

Perangkat ini lambat (10 cps) dan berisik dan jelek dan pandangannya dari set karakter ASCII berakhir pada 0x5f, jadi itu (melihat dekat pada pic) tidak ada kunci:

{ | } ~ 

The 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.

Contoh Anda sebenarnya adalah dua ??!, masing-masing arti |, jadi hasilnya ||.

Namun, orang yang menulis kode C hampir pasti memiliki peralatan modern,1 jadi tebakan saya adalah: seseorang pamer atau menghibur diri mereka sendiri, meninggalkan semacam telur Paskah dalam kode untuk Anda temukan.

Itu pasti berhasil, itu menyebabkan pertanyaan SO yang sangat populer.

ASR-33 Teletype

ASR-33 Teletype


1. Dalam hal ini, trigraphs diciptakan oleh komite ANSI, yang pertama kali bertemu setelah C menjadi sukses yang berhasil, sehingga tidak ada kode C asli atau coders yang akan menggunakannya.


354
2017-10-19 21:09



Ini adalah C trigraph. ??! aku s |, jadi ??!??! adalah operatornya ||


140
2017-10-19 16:58



Seperti telah dinyatakan ??!??! pada dasarnya adalah dua trigraphs (??! dan ??! lagi) dijepit bersama yang diganti-diterjemahkan ke ||, yaitu Logika OR, oleh preprocessor.

Gambar berikut yang mengandung semua trigraph harus membantu membedakan kombinasi trigraph alternatif:

enter image description here (Gambar diambil dari C: Manual Referensi Edisi ke-5)

Jadi sebuah trigraph yang mirip ??(??) akhirnya akan memetakan ke [], ??(??)??(??) akan digantikan oleh [][] dan seterusnya, Anda mendapatkan ide itu.

Karena trigraph diganti selama preproses yang dapat Anda gunakan cpp untuk mendapatkan tampilan output sendiri, menggunakan konyol trigr.c program:

void main(){ const char *s = "??!??!"; } 

dan memprosesnya dengan:

cpp -trigraphs trigr.c 

Anda akan mendapatkan keluaran konsol

void main(){ const char *s = "||"; }

Seperti yang bisa Anda perhatikan, opsi -trigraphs harus ditentukan atau yang lain cpp akan mengeluarkan peringatan; ini menunjukkan bagaimana trigraphs adalah sesuatu dari masa lalu dan tidak ada nilai modern selain membingungkan orang yang mungkin menabrak mereka.


Adapun alasan di balik pengenalan trigraphs, lebih baik dipahami ketika melihat Sejarah bagian dari ISO/IEC 646:

ISO / IEC 646 dan pendahulunya ASCII (ANSI X3.4) sebagian besar mendukung praktik yang ada terkait pengkodean karakter dalam industri telekomunikasi.

Karena ASCII tidak menyediakan sejumlah karakter yang diperlukan untuk bahasa selain bahasa Inggris, sejumlah varian nasional dibuat yang menggantikan beberapa karakter yang kurang digunakan dengan yang dibutuhkan


79
2018-03-25 02:24