Soalan ini berpunca daripada cadangan menghantar ke unsigned char diperlukan sebelum memanggil fungsi manipulasi aksara seperti std::toupper dan std::tolower. Walau bagaimanapun, kod Bjarne Stroustrup nampaknya menggunakan fungsi ini tanpa menghantar.
Char Representation
Char, signed char dan unsigned char ialah jenis yang berbeza dalam C . Char mungkin mewakili julat yang setara dengan char yang ditandatangani atau char yang tidak ditandatangani. Dalam sistem di mana char ditandatangani, keseluruhan set aksara mempunyai nilai bukan negatif.
Fungsi topper
Menurut standard C, topper menerima hujah int dan mengembalikan hasil int. Nilai input mesti boleh diwakili sebagai aksara tidak bertanda atau sama dengan EOF. Jika tidak, tingkah laku itu tidak ditentukan.
Tingkah Laku Tidak Ditakrifkan
Jika char biasa ditandatangani dan nilai yang dihantar kepada toupper adalah negatif, tingkah laku tidak ditentukan berlaku. Ini kerana penukaran tersirat kepada int menghasilkan nilai negatif.
Menghantar ke Unsigned Char
Menghantar hujah char ke unsigned char memastikan nilai tersebut bukan negatif , mengelakkan tingkah laku yang tidak ditentukan. Walaupun char dan unsigned char mempunyai saiz yang sama, ia mewakili julat nilai yang berbeza.
Pelaksanaan
Fungsi ini biasanya dilaksanakan menggunakan jadual carian. Pengindeksan melebihi had jadual boleh membawa kepada tingkah laku yang tidak ditentukan. Menukar kepada aksara yang tidak ditandatangani secara langsung tidak mengelakkan isu ini jika hasilnya secara tersirat ditukar kembali kepada nilai negatif.
Pengecualian: EOF
Fungsi dalam
Pengubahsuaian C
Piawaian C hanya mengubah suai fungsi perpustakaan standard C tertentu dan tiada pelarasan pada fungsi dalam
Kesimpulan
Untuk mengelakkan tingkah laku yang tidak ditentukan, adalah perlu untuk menghantar argumen char kepada unsigned char sebelum memanggil toupper, tolower atau yang serupa berfungsi, walaupun char ialah jenis bertanda bukan negatif.
Atas ialah kandungan terperinci Patutkah saya Hantar ke `unsigned char` Sebelum Menggunakan `toupper()`, `tolower()`, dsb.?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!