Di perpustakaan khusus saya melihat implementasi:
inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}
Apakah itu telur Paskah atau apa keunggulan vs metode C / C ++ standar?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
'J' - 'I'
dan'S' - 'R'
keduanya sama1
, maka saya berharap pengoptimal yang masuk akal akan mengubah yang pertama di yang kedua.Jawaban:
Penulis kode ini mungkin harus mendukung EBCDIC di beberapa titik, di mana nilai-nilai numerik dari huruf non-contiguous (ada kesenjangan antara
I
,J
danR
,S
seperti yang bisa Anda tebak).Perlu dicatat bahwa C dan C ++ standar satunya jaminan bahwa karakter
0
untuk9
memiliki nilai numerik bersebelahan justru karena alasan ini, sehingga tak satu pun dari metode ini adalah ketat standar sesuai.sumber
// In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details
. Maka Anda bahkan tidak perlu mengajukan pertanyaan. Anda memiliki jawaban untuk kode tersebut.return ( isalpha( chValue ) && isupper( chValue ) )
...Sepertinya itu mencoba untuk menutupi EBCDIC dan ASCII. Metode alternatif Anda tidak berfungsi untuk EBCDIC (memiliki positif palsu, tetapi tidak ada negatif palsu)
C dan C ++ memang membutuhkan yang
'0'-'9'
berdekatan.Perhatikan bahwa panggilan perpustakaan standar yang tahu apakah mereka berjalan di ASCII, EBCDIC atau sistem lainnya, sehingga mereka lebih portabel dan mungkin lebih efisien.
sumber
std::isupper
sebenarnya menanyakan lokal C global yang saat ini diinstal.'A'
harus tetap'A'
terlepas dari lokal. ASCII ke UTF-8, itu mungkin saja terjadi.std::isupper
kueri global C global yang saat ini diinstal, ya, tetapi fase kompilasi yang menafsirkan literal karakter tidak.std::isupper
benar-benar dibutuhkan dalam banyak kasus. Itu menghormati lokal yang digunakan untuk input dari pengguna. Tetapi ketika mem-parsing file, berinteraksi dengan basis data Anda biasanya mengharapkan beberapa lokal lain. Terlebih lagi, setidaknya di Linux, panggilan lokal terkait ini sangat lambat - misalnyastd::isalpha
panggilan dynamic_cast dua kali untuk "menemukan" implementasi lokal yang tepat sebelum benar-benar membandingkan satu karakter.