इस C कोड में वर्णमाला को कई श्रेणियों में क्यों विभाजित किया गया है?


161

एक कस्टम लाइब्रेरी में मैंने एक कार्यान्वयन देखा:

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

क्या वह ईस्टर अंडा है या मानक सी / सी ++ विधि बनाम क्या फायदे हैं?

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

ध्यान दें कि EBCDIC में, अपर-केस अक्षरों के लिए वर्ण-श्रेणी से पहले वर्ण-श्रेणी आती है, और दोनों अंक से पहले आते हैं - जो ASCII- आधारित एन्कोडिंग में क्रम के विपरीत है (जैसे कि 8259-) एक्स श्रृंखला, या यूनिकोड, या CP1252, या ...)।
जोनाथन लेफ़लर

1
नोट: यदि 'J' - 'I'और 'S' - 'R'दोनों समान हैं 1, तो मुझे उम्मीद है कि एक उचित आशावादी बाद में पूर्व को बदल देगा।
मैथ्यू एम।

जवाबों:


214

इस कोड के लेखक शायद का समर्थन करने के लिए किया था EBCDIC कुछ बिंदु है, जहां पत्र के संख्यात्मक मान गैर-निरंतर (अंतराल के बीच मौजूद हैं पर I, Jऔर R, S, आप अनुमान लगाया हो सकता है)।

यह ध्यान देने योग्य है कि C और C ++ मानकों केवल गारंटी नहीं है कि पात्रों के लायक है 0के लिए 9इसी कारण के लिए सन्निहित संख्यात्मक मान है, इन तरीकों में से इसलिए कोई भी सख्ती से मानक के अनुरूप है।


64
असली डब्ल्यूटीएफ क्यों मूल लेखक ने एक टिप्पणी में नहीं डाला है // In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details:। फिर आपको कभी सवाल पूछने की जरूरत नहीं होगी। आपके पास कोड में निर्मित उत्तर होगा।
अबेलेंकी

66
@abelenky यदि कोड मूल रूप से एक ऐसी प्रणाली के लिए था, जहां ई-बीडीके आमतौर पर उपयोग किया जाता है, तो यह उस समय स्पष्ट लग सकता था और टिप्पणी की आवश्यकता नहीं थी, दुर्भाग्य से जो चीजें विरासत कोड में ठीक लगती हैं वे अब अजीब लगती हैं।
वैधता

26
@abelenky: असली डब्ल्यूटीएफ यही है कि मूल लेखक मानक कार्यक्षमता का उपयोग क्यों नहीं करता है, return ( isalpha( chValue ) && isupper( chValue ) )...
DevSolar

4
@ डैमन: यह मुद्दा नहीं है। आपको उस सिस्टम पर भी "एलियन" एन्कोडिंग की प्रक्रिया करनी पड़ सकती है जो उस एन्कोडिंग का उपयोग मूल रूप से नहीं करता है। तो आप दिए गए एन्कोडिंग के लिए अपना स्थान निर्धारित करते हैं, और फिर आपको अपनी उंगलियों को पार करना होगा कि प्रोग्रामर वास्तव में ऊपर की तरह "स्मार्ट" कोडिंग करने के बजाय मानक कार्यों का उपयोग करता है, यह सोचकर कि वह जानता है कि उसके प्रोग्राम को हर एन्कोडिंग कभी भी मुठभेड़ होगी ...
देवसोलर

6
अगर यह 1970 के ईबीसीडीआईसी का समर्थन करने के लिए लिखा गया था, तो क्या आईएसएलपी भी आइसलफा और आइसुपर था या फिर अधिकांश कंपाइलरों द्वारा समर्थित था?
निकल ६'१५

54

ऐसा लगता है कि यह EBCDIC और ASCII दोनों को कवर करने का प्रयास करता है। आपकी वैकल्पिक विधि EBCDIC के लिए काम नहीं करती है (इसमें गलत सकारात्मकता है, लेकिन कोई गलत नकारात्मक नहीं है)

C और C ++ के लिए आवश्यक है कि '0'-'9'वे सन्निहित हों।

नोट मानक पुस्तकालय कॉल कि है जानते हैं कि वे ASCII, EBCDIC या अन्य प्रणालियों पर चलने चाहे, तो वे अधिक पोर्टेबल और संभवतः अधिक कुशल हो।


5
std::isupperवास्तव में वर्तमान में स्थापित वैश्विक सी लोकेल पर सवाल उठाता है।
लिंगसी

1
हाँ आप सही है। दोनों एनकोडिंग को कवर करने के लिए विधि लिखी गई है। जवाब के लिए धन्यवाद!
व्लादिमीर चौ।

4
@Lingxi: सच है, लेकिन इसका मतलब यह नहीं है कि आप ASCII से EBCDIC में लोकल स्विच कर सकते हैं। लोकेल से बेपरवाह 'A'रहना है 'A'। ASCII से UTF-8 तक, यह संभव होगा।
MSalters

2
@Lingxi: std::isupperवर्तमान में स्थापित वैश्विक सी लोकेल, हां, लेकिन वर्ण शाब्दिकों की व्याख्या करने वाले संकलन का चरण नहीं है।
को ऑर्बिट में हल्कापन दौड़

1
@ लिंगजी - बस जल्दी ध्यान दें। यह संदिग्ध है कि क्या std::isupperवास्तव में ज्यादातर मामलों में इसकी आवश्यकता है। यह उपयोगकर्ता से इनपुट के लिए उपयोग किए जाने वाले स्थानों का सम्मान करता है। लेकिन फ़ाइलों को पार्स करते समय, डेटाबेस के साथ बातचीत करके आप आमतौर पर कुछ अन्य लोकेल की अपेक्षा करते हैं। इसके अलावा कम से कम लिनक्स पर ये स्थानीय संबंधित कॉल बहुत धीमी होती हैं - उदाहरण के लिए, std::isalphaडायनामिक_कास्ट को दो बार कॉल करने से पहले वास्तव में एकल वर्ण की तुलना करने के लिए उचित लोकेल कार्यान्वयन "खोजने" के लिए।
ibre5041
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.