0x41 के साथ वर्ण 'ए' की तुलना क्यों की जाएगी?


89

मैं कुछ सी ++ कोड को देख रहा था और निम्नलिखित निर्माण पाया:

if('A' == 0x41) {
  // ...
} else if('A' == 0xc1) {
  // ...
} else {
  // ...
}

मुझे एक दृश्य स्टूडियो चेतावनी मिल रही है :

चेतावनी C4127 सशर्त अभिव्यक्ति स्थिर है।

विजुअल स्टूडियो स्पष्ट रूप से सही है - निश्चित रूप से 'ए' को 0x41 परिभाषित किया गया है। लेखक इस कोड को क्यों लिख रहा है, यह देखते हुए कि तीन शाखाओं में से दो मृत कोड हैं?


30
वे आवश्यक रूप से मृत कोड नहीं हैं, शायद यह चरित्र सेट की जांच करने का सिर्फ एक अच्छा तरीका है।
जॉर्ज

60
'ए' = सी 1 EBCDIC में
हेरोल्ड

14
मैं इसे यूटिलिटी हेडर #define IS_CHSET_EBCDIC ('A' == 0xc1)आदि में डालूँगा; या, आधुनिक C ++ में, इसे a बनाएं constexpr
पीटर -

8
@ b.buchhold - नहीं, आप एक पीसी से मेनफ्रेम तक संकलन कर सकते हैं। इसलिए 'ए' का मतलब निष्पादन चरित्र सेट में चरित्र के मूल्य से होना चाहिए।
बो पर्सन

2
ऐसा लगता है कि यह सबसे अच्छा प्रीप्रोसेसर सशर्त समावेशन (उदाहरण #if 'a' == 41 ... #else ... #endif) का उपयोग करके गतिशील शाखाओं के बजाय ऐसा करने के लिए हो सकता है ताकि आपको इस तरह की चेतावनी न मिले । क्या इससे काम हो जायेगा?
templatetypedef

जवाबों:


116

0xc1के लिए EBCDICवर्ण सेट कोड है A। लेखक ऐसी मशीन के लिए परीक्षण कर रहा है।

http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html


14
"चरित्र सेट की जांच करने के लिए इससे बेहतर तरीका क्या है?" ऐसा करने का कोई मानक तरीका नहीं है। C11 में, यह जांचने का एक तरीका है कि क्या कुछ यूनिकोड एनकोडिंग का उपयोग किया जा रहा है, लेकिन MSVC पूरी तरह से C99 (जो कि C11 को पूर्वनिर्धारित करता है) का समर्थन नहीं करेगा। "यह वैकल्पिक चरित्र कितना सामान्य है!" आईबीएम मेनफ्रेम के अलावा? हर्गिज नहीं।

2
तो इसके लिए अंतिम elseशाखा क्या है ? वहाँ अभी भी एक में उपयोग चरित्र एन्कोडिंग है कि ASCII और न ही EBCDIC के साथ संगत है?
dan04

8
@ dan04 कोई भी जिसे मैं नहीं जानता, लेकिन यह वास्तविक रूप से "अज्ञात एन्कोडिंग, प्रिंट त्रुटि संदेश" शाखा के रूप में सरल हो सकता है।

8
Apple A DOS 3.3 वर्ण एन्कोडिंग में 'A' भी 0xC1 है, जो कि 0x80 के साथ ASCII OR'd है।
डेमियन येरिक

2
@ राइमॉइड वास्तव में एक अच्छा मौका है कि माइक्रोसॉफ्ट कभी भी C99 का समर्थन करने से पहले C11 को लागू करेगा। वे उन विक्रेताओं में से एक थे जिन्होंने C99 सुविधाओं को लागू करने के लिए मुश्किल के खिलाफ वापस धक्का दिया, जिनमें से दो C11 en.wikipedia.org/wiki/… में अनिवार्य नहीं हैं ।
स्टीव कॉक्स

11

पहली नजर में ऐसा लग सकता है कि मृत कोड है लेकिन 'ए' == 0x41 हमेशा सही नहीं होगा।

डेवलपर ने यहां क्या करने की कोशिश की है, यह जानकर है कि ASCII या EBCDIC के किसी भी प्रकार को लागू करने वाली मशीन क्या एन्कोडिंग है

के रूप में @Richard राजधानी सुझाव दिया एक को मैप किया है 0xc1 में इंटरनेशनल - विस्तारित द्विआधारी कोडित दशमलव इंटरचेंज कोड यदि किसी और के 2 शाखा में नीचे तालिका देखें ...

यहां छवि विवरण दर्ज करें

एक और अलग मूल्य ASCII द्वारा निर्वासन के लिए पाया जा सकता है:

यहां छवि विवरण दर्ज करें

वह भी कर सकता था:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}

दूसरे पैराग्राफ में - क्या आपका मतलब EBDIC के बजाय EBCDIC था?
4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.