Menurut C ++ '03 Standard 2.3 / 1:
Sebelum pemrosesan lain terjadi, setiap kemunculan salah satu dari tiga karakter berikut (“sekuens trigraph”) digantikan oleh karakter tunggal yang ditunjukkan pada Tabel 1.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
Dalam kehidupan nyata itu berarti bahwa kode printf( "What??!\n" );
akan menghasilkan pencetakan What|
karena ??!
merupakan urutan trigraph yang diganti dengan |
karakter.
Pertanyaan saya adalah apa tujuan menggunakan trigraph? Apakah ada manfaat praktis menggunakan trigraph?
UPD : Dalam jawaban disebutkan bahwa beberapa keyboard Eropa tidak memiliki semua karakter tanda baca, jadi programmer non-AS harus menggunakan trigraph dalam kehidupan sehari-hari?
UPD2 : Visual Studio 2010 memiliki dukungan trigraph dimatikan secara default.
Jawaban:
Pertanyaan ini (tentang digraf yang terkait erat) memiliki jawabannya.
Itu bermuara pada kenyataan bahwa set karakter ISO 646 tidak memiliki semua karakter dari sintaks C, jadi ada beberapa sistem dengan keyboard dan tampilan yang tidak dapat berurusan dengan karakter (meskipun saya membayangkan bahwa ini sangat langka sekarang).
Secara umum, Anda tidak perlu menggunakannya, tetapi Anda perlu tahu tentang mereka untuk masalah yang Anda hadapi. Trigraph adalah alasan
?
karakter ' ' memiliki urutan pelarian:Jadi beberapa cara Anda dapat menghindari masalah contoh Anda adalah:
Tetapi Anda harus ingat ketika Anda mengetik keduanya '?' karakter yang Anda mungkin memulai trigraph (dan tentu saja tidak pernah sesuatu yang saya pikirkan).
Dalam praktiknya, trigraph dan digraf adalah sesuatu yang tidak saya khawatirkan sama sekali sehari-hari. Tetapi Anda harus mewaspadai mereka karena setiap dua tahun sekali Anda akan menemui bug yang terkait dengannya (dan Anda akan menghabiskan sisa hari itu dengan mengutuk keberadaan mereka). Akan lebih baik jika kompiler dapat dikonfigurasikan untuk memperingatkan (atau kesalahan) ketika menemukan trigraph atau digraf, jadi saya bisa tahu saya punya sesuatu yang harus saya tangani dengan sadar.
Dan hanya untuk kelengkapan, digraf jauh lebih berbahaya karena mereka diproses sebagai token, sehingga digraf di dalam string literal tidak akan ditafsirkan sebagai digraf.
Untuk pendidikan yang bagus tentang berbagai kesenangan dengan tanda baca dalam program C / C ++ (termasuk bug trigraph yang pasti akan membuat saya mencabut rambut saya), lihat artikel Herb Sutter's GOTW # 86 .
Tambahan:
Sepertinya GCC tidak akan memproses (dan akan memperingatkan tentang) trigraph secara default. Beberapa kompiler lain memiliki opsi untuk mematikan dukungan trigraph (misalnya IBM). Microsoft mulai mendukung peringatan (C4837) di VS2008 yang harus diaktifkan secara eksplisit (menggunakan -Dinding atau sesuatu).
sumber
Anak-anak hari ini! :-)
Ya, peralatan asing, seperti terminal IBM 3270. 3270 memiliki, jika saya ingat, tidak ada kawat gigi keriting! Jika Anda ingin menulis C pada mini / mainframe IBM, Anda harus menggunakan trigraph celaka untuk setiap batas blok. Untungnya, saya hanya perlu menulis perangkat lunak dalam C untuk meniru beberapa fasilitas komputer mini IBM, tidak benar-benar menulis perangkat lunak C pada Sistem / 36.
Lihat di sebelah tombol "P":
Hmmm. Sulit dikatakan. Ada tombol tambahan di sebelah "carriage return", dan saya mungkin memilikinya mundur: mungkin itu pasangan "[" / "]" yang hilang. Bagaimanapun, keyboard ini akan membuat Anda sedih jika Anda harus menulis C.
Juga, terminal-terminal ini menampilkan EBCDIC, set karakter mainframe "asli" IBM, bukan ASCII (terima kasih, Pavel Minaev, untuk pengingatnya).
Di sisi lain, seperti panduan GNU C mengatakan: "Anda tidak perlu kerusakan otak ini." Kompiler gcc membiarkan "fitur" ini dinonaktifkan secara default.
sumber
Dari
The C++ Programming Language
Edisi Khusus, halaman 829sumber
`
, yang hilang dari bahasa Italia dan beberapa tata letak keyboard lainnyaMereka digunakan pada sistem yang tidak memiliki beberapa karakter dalam rangkaian karakter dasar C ++. Tidak perlu dikatakan, sistem seperti itu sangat langka.
sumber
Trigraph telah diusulkan untuk dihapus dalam C ++ 0x. Yang mengatakan, tampaknya masih ada argumen kuat dalam mendukung mereka - lihat kertas komite C ++ N2910 yang membahas hal ini. Tampaknya, EBCDIC adalah salah satu benteng utama di mana mereka dibutuhkan.
sumber
Saya telah melihat trigraph yang digunakan pada awal 90-an untuk membantu mengkonversi program PL / 1 dari mainframe untuk dijalankan / dikompilasi / di-debug pada PC.
Mereka berkecimpung dengan mengedit PL / I pada PC menggunakan kompiler PL / I ke C dan mereka ingin kode untuk bekerja ketika dipindahkan kembali ke mainframe yang tidak mendukung kurung kurawal. Saya menyarankan agar mereka dapat menggunakan macro seperti
atau sebagai alternatif PL / I yang ramah
dan jika mereka benar-benar ingin mendapatkan kesenangan mereka bisa mencoba
dan kemudian program akan terlihat seperti ditulis dalam Pascal. Mereka hanya memandang saya lucu dan tidak akan berbicara kepada saya selama sisa hari itu. Saya tidak berpikir saya menyalahkan mereka. :)
Apa yang membunuh upaya apa yang bukan grafik-tri, itu adalah perbedaan sistem IO antara platform. Membuka file pada PC jauh berbeda dari mainframe yang akan memperkenalkan terlalu banyak kludges untuk membuat kode yang sama berjalan pada keduanya.
sumber
Terutama karena standar C memperkenalkan mereka kembali pada tahun 1989, ketika ada masalah dengan kehadiran karakter yang dipetakan trigraph pada beberapa mesin. Pada saat standar C ++ diterbitkan pada tahun 1998, kebutuhan akan trigraph tidak terlalu bagus. Mereka adalah kutil pada C; mereka hanya kutil pada C ++. Ada kebutuhan bagi mereka - terutama di luar dunia berbahasa Inggris - itulah sebabnya mereka ditambahkan ke C.
sumber
Beberapa keyboard Eropa tidak (tidak?) Memiliki semua karakter tanda baca yang dimiliki keyboard AS, karena mereka memerlukan kunci untuk karakter alfabet yang tidak biasa. Jadi misalnya (mengada-ada), keyboard Swedia akan memiliki A-ring di mana kurung kurawal berada.
Untuk mengakomodasi para pengguna tersebut, trigraph adalah cara untuk memasukkan tanda baca menggunakan hanya karakter ASCII yang paling umum.
sumber
Mereka ada di sana sebagian besar karena alasan historis. Saat ini, sebagian besar papan ketik modern untuk sebagian besar bahasa memungkinkan akses ke semua karakter itu, tetapi ini pernah menjadi masalah pada beberapa papan ketik Eropa. Inilah mengapa trigraph ditemukan.
Jika Anda tidak tahu untuk apa itu, Anda tidak boleh menggunakannya.
Meskipun demikian, tetap baik untuk menyadarinya, karena Anda mungkin secara tidak sengaja dan tidak sengaja menggunakannya dalam kode Anda.
sumber