Apabila Memanggil toupper() dan tolower(): Menghantar ke unsigned char
Sementara pengulas bereputasi tinggi pada Stack Overflow mencadangkan menghantar char- hujah kepada unsigned char sebelum memanggil toupper atau tolower, keperluan ini tidak disebut secara eksplisit oleh Bjarne Stroustrup dalam "Bahasa Pengaturcaraan C." Perbezaan pendapat ini mencetuskan persoalan: adakah pelakon seperti itu perlu atau adakah ia satu kesilapan?
Jenis dan Perwakilan
char, char yang ditandatangani dan char yang tidak ditandatangani adalah berbeza jenis. Walaupun char biasanya mewakili sama ada perwakilan yang ditandatangani atau tidak ditandatangani, fungsi toupper memerlukan argumen int yang boleh diwakili sebagai aksara yang tidak ditandatangani. Jika hujah tidak boleh diwakili atau sama dengan EOF, gelagat tidak ditentukan berlaku.
Tingkah Laku Tidak Ditakrifkan
Andaikan char biasa adalah daripada jenis yang ditandatangani. Jika nama[0] menunjukkan nilai negatif, menggunakan toupper(nama[0]) berisiko kepada tingkah laku yang tidak ditentukan. Walau bagaimanapun, untuk contoh yang diberikan oleh Stroustrup, pemulaan menjamin nilai bukan negatif.
Penukaran Tidak Diperlukan
Walau bagaimanapun, penukaran char kepada (unsigned)char tidak menyelesaikan isu kerana ia mungkin masih menghasilkan nilai int negatif disebabkan oleh tersirat penukaran.
Pertimbangan Praktikal
Walaupun toupper boleh dilaksanakan untuk mengendalikan nilai negatif, ia tidak wajib. Selain itu, fungsi ini mesti menerima hujah yang sama dengan EOF (-1), yang biasanya merupakan nilai negatif.
Kesimpulan
Walaupun penerimaannya terhadap EOF, topper memerlukan aksara input boleh diwakili sebagai aksara tidak bertanda untuk mengelakkan tingkah laku yang tidak ditentukan. Walaupun contoh Stroustrup mungkin tidak menunjukkan keperluan untuk menghantar, ini adalah amalan yang disyorkan untuk memastikan kemudahalihan dan kefungsian yang betul, terutamanya apabila berurusan dengan watak negatif atau khas.
Atas ialah kandungan terperinci Ke `toupper()` dan `tolower()`: Mestikah Kami Hantar ke `unsigned char`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!