Alfabe neden bu C kodunda birden çok aralığa ayrılıyor?


161

Özel bir kütüphanede bir uygulama gördüm:

inline int is_upper_alpha(char chValue)
{
    if (((chValue >= 'A') && (chValue <= 'I')) ||
        ((chValue >= 'J') && (chValue <= 'R')) ||
        ((chValue >= 'S') && (chValue <= 'Z')))
        return 1;
    return 0;
}

Bu bir Paskalya yumurtası mı yoksa standart C / C ++ yöntemine göre avantajları nelerdir?

inline int is_upper_alpha(char chValue)
{
    return ((chValue >= 'A') && (chValue <= 'Z'));
}

EBCDIC'de, küçük harfler için karakter aralığının büyük harfler için karakter aralığından önce geldiğini ve her ikisinin de rakamlardan önce geldiğini unutmayın - ASCII tabanlı kodlamalarda (8859 gibi) x serisi veya Unicode veya CP1252 veya…).
Jonathan Leffler

1
Not: 'J' - 'I've 'S' - 'R'her ikisi de eşitse 1, o zaman makul bir optimize edicinin ikincisini değiştireceğini umuyorum.
Matthieu M.

Yanıtlar:


214

Bu kodun yazar muhtemelen desteklemek zorunda EBCDIC harflerin sayısal değerleri (boşluklar arasında var bitişik olmayan bazı noktada I, Jve R, S, tahmin edebileceğiniz gibi).

C ve C ++ standartlarının sadece karakterlerin tam olarak bu nedenle bitişik sayısal değerlere sahip olmasını garanti ettiğini 0belirtmek 9gerekir, bu nedenle bu yöntemlerin hiçbiri kesinlikle standartlara uygun değildir.


64
Bir yorumda koymak orijinal yazarın vermedi neden gerçek WTF: // In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details. O zaman asla soruyu sormak zorunda kalmazsınız. Yanıtın kodda yerleşik olarak bulunması gerekir.
abelenky

66
@abelenky Kod aslen ebcdic'in normal olarak kullanıldığı bir sistem içindeyse, o zaman bariz görünebilir ve bir yoruma ihtiyaç duymamış olabilir, maalesef eski kodda iyi görünen şeyler şimdi garip görünüyor.
Geçerlilik

26
@abelenky: Gerçek WTF neden orijinal yazarın standart işlevselliği kullanmadığı, yani return ( isalpha( chValue ) && isupper( chValue ) )...
DevSolar

4
@Damon: Sorun bu değil. Bu kodlamayı yerel olarak kullanmayan bir sistemde bile bir "yabancı" kodlaması işlemeniz gerekebilir . Böylece, yerel ayarınızı verilen kodlamaya ayarlıyorsunuz ve daha sonra programcının şimdiye kadar kodlamanın her karşılaşacağını bildiğini düşünerek, programlayıcının yukarıdaki gibi "akıllı" kodlama yapmak yerine standart işlevleri kullandığını parmaklarınızı çapraz tutmanız gerekiyor ...
DevSolar

6
Eğer 1970'lerden itibaren EBCDIC'i desteklemek için yazıldıysa, isalpha ve isupper bile ANSI mıydı veya derleyicilerin çoğunluğu tarafından destekleniyor muydu?
nickalh

54

Görünüşe göre hem EBCDIC hem de ASCII'yi kapsamaya çalışıyor. Alternatif yönteminiz EBCDIC için çalışmıyor (yanlış pozitifleri var, ancak yanlış negatifleri yok)

C ve C ++ yapmak gerektirir '0'-'9'bitişik bulunmaktadır.

Not standart kütüphane çağrıları olduğunu do onlar daha taşınabilir ve muhtemelen daha verimli konum yüzden, ASCII, EBCDIC veya diğer sistemleri üzerinde çalışan olmadığını biliyoruz.


5
std::isuppergerçekte kurulu olan global C yerel ayarını sorgular.
Lingxi

1
Evet haklısın. Yöntem, her iki kodlamayı da kapsayacak şekilde yazılmıştır. Cevap için teşekkürler!
Vladimir Ch.

4
@Lingxi: Doğru, ancak bu, yerel ayarı ASCII'den EBCDIC'e değiştirebileceğiniz anlamına gelmez. 'A'yerelden 'A'bağımsız olarak kalmalıdır . ASCII'den UTF-8'e, bu mümkün olabilir.
MSalters

2
@Lingxi: std::isupperşu anda kurulu olan global C yerel ayarını sorgular, evet, ancak karakter değişmezlerini yorumlayan derleme aşaması bunu yapmaz.
Yörüngedeki Hafiflik Yarışları

1
@ Lingxi - Sadece hızlı not. std::isupperÇoğu durumda gerçekten gerekli olup olmadığı tartışmalıdır . Kullanıcıdan gelen girdi için kullanılan yerel ayarlara saygılıdır. Ancak dosyaları ayrıştırırken, veritabanlarıyla etkileşime girerken genellikle başka bir yerel ayar beklersiniz. Ayrıca en azından Linux'ta bu yerel ayarlarla ilgili çağrılar çok yavaştır; örneğin std::isalpha, tek bir karakteri gerçekten karşılaştırmadan önce uygun yerel ayar uygulamasını "bulmak" için iki kez dynamic_cast'i çağırır.
ibre5041
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.