Trigraf jatuh
File sumber dikodekan dalam himpunan karakter fisik yang dipetakan dalam cara implementasi yang ditentukan ke himpunan karakter sumber , yang ditentukan dalam standar. Untuk mengakomodasi pemetaan dari beberapa kumpulan karakter fisik yang tidak memiliki semua tanda baca yang diperlukan oleh kumpulan karakter sumber, bahasa menentukan trigraf — urutan tiga karakter umum yang dapat digunakan sebagai pengganti karakter tanda baca yang kurang umum. Preprocessor dan compiler diperlukan untuk menangani ini.
Di C ++ 17, trigraf telah dihapus. Jadi beberapa file sumber tidak akan diterima oleh kompiler yang lebih baru kecuali mereka diterjemahkan pertama kali dari kumpulan karakter fisik ke beberapa kumpulan karakter fisik lainnya yang memetakan satu-ke-satu ke kumpulan karakter sumber. (Dalam praktiknya, sebagian besar kompiler hanya membuat interpretasi trigraf opsional.) Ini bukan perubahan perilaku halus, tetapi perubahan yang merusak mencegah file sumber yang sebelumnya dapat diterima untuk dikompilasi tanpa proses terjemahan eksternal.
Lebih banyak kendala char
Standar juga mengacu pada himpunan karakter eksekusi , yang didefinisikan implementasi, tetapi harus berisi setidaknya seluruh himpunan karakter sumber ditambah sejumlah kecil kode kontrol.
Standar C ++ didefinisikan char
sebagai tipe integral yang mungkin tidak bertanda tangan yang dapat secara efisien mewakili setiap nilai dalam set karakter eksekusi. Dengan representasi dari seorang pengacara bahasa, Anda dapat berargumen bahwa a char
harus minimal 8 bit.
Jika implementasi Anda menggunakan nilai unsigned untuk char
, maka Anda tahu itu dapat berkisar dari 0 hingga 255, dan karenanya cocok untuk menyimpan setiap nilai byte yang mungkin.
Tetapi jika implementasi Anda menggunakan nilai yang ditandatangani, itu memiliki opsi.
Sebagian besar akan menggunakan komplemen dua, memberikan char
kisaran minimum -128 hingga 127. Itu berarti 256 nilai unik.
Tetapi opsi lain adalah tanda + magnitudo, di mana satu bit dicadangkan untuk menunjukkan apakah bilangan tersebut negatif dan tujuh bit lainnya menunjukkan besarnya. Itu akan memberikan char
kisaran -127 hingga 127, yang hanya 255 nilai unik. (Karena Anda kehilangan satu kombinasi bit yang berguna untuk mewakili -0.)
Saya tidak yakin panitia pernah secara eksplisit menetapkan ini sebagai cacat, tetapi itu karena Anda tidak dapat mengandalkan standar untuk menjamin perjalanan pulang pergi dari dan unsigned char
ke char
belakang akan mempertahankan nilai aslinya. (Dalam praktiknya, semua implementasi melakukannya karena mereka semua menggunakan dua komplemen untuk tipe integral bertanda tangan.)
Baru-baru ini (C ++ 17?) Kata-katanya diperbaiki untuk memastikan perjalanan bolak-balik. Perbaikan itu, bersama dengan semua persyaratan lainnya char
, secara efektif mengamanatkan pelengkap dua untuk ditandatangani char
tanpa mengatakan secara eksplisit (bahkan ketika standar terus memungkinkan representasi tanda + besaran untuk jenis integral bertanda tangan lainnya). Ada proposal yang meminta semua tipe integral bertanda tangan menggunakan komplemen dua, tapi saya tidak ingat apakah itu berhasil menjadi C ++ 20.
Jadi satu ini adalah semacam kebalikan dari apa yang Anda cari karena memberikan sebelumnya yang salah terlalu lancang kode memperbaiki berlaku surut.