เหตุใดจึงต้องเปรียบเทียบอักขระ 'A' กับ 0x41


89

ฉันกำลังดูโค้ด C ++ และพบโครงสร้างต่อไปนี้:

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

ฉันได้รับคำเตือนVisual Studioว่า:

คำเตือน C4127 นิพจน์เงื่อนไขคงที่

Visual Studio นั้นถูกต้อง - แน่นอนว่า 'A' ถูกกำหนดให้เป็น 0x41 เหตุใดผู้เขียนจึงเขียนโค้ดนี้เนื่องจากสองในสามสาขาเป็นรหัสที่ตายแล้ว


30
พวกเขาไม่จำเป็นต้องตายรหัสอาจเป็นเพียงวิธีโง่ ๆ ในการตรวจสอบชุดอักขระ
George

60
'A' = C1 ใน EBCDIC
harold

14
ฉันจะใส่ไว้ในส่วนหัวของยูทิลิตี้เช่น#define IS_CHSET_EBCDIC ('A' == 0xc1)อื่น ๆ ; หรือใน C ++ สมัยใหม่ทำให้เป็นconstexprไฟล์.
Peter - Reinstate Monica

8
@ b.buchhold - ไม่คุณสามารถข้ามคอมไพล์จากพีซีไปยังเมนเฟรมได้ ดังนั้น 'A' ต้องหมายถึงค่าของอักขระในชุดอักขระดำเนินการ
Bo Persson

2
ดูเหมือนว่าสิ่งนี้จะทำได้ดีที่สุดโดยใช้การรวมเงื่อนไขของตัวประมวลผลล่วงหน้า (เช่น #if 'a' == 41 ... #else ... #endif) เพื่อทำสิ่งนี้แทนที่จะเป็นสาขาแบบไดนามิกเพื่อที่คุณจะไม่ได้รับคำเตือนเช่นนี้ . จะได้ผลหรือไม่?
templatetypedef

คำตอบ:


117

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 มีวิธีตรวจสอบว่ามีการใช้การเข้ารหัส Unicode หรือไม่ แต่ MSVC จะไม่รองรับ C99 อย่างสมบูรณ์ (ซึ่งก่อนหน้า C11) "ชุดอักขระทางเลือกนี้ธรรมดาแค่ไหน!" นอกเหนือจากเมนเฟรมของไอบีเอ็ม? ไม่ใช่เลย.

2
แล้วelseสาขาสุดท้ายสำหรับอะไร? มีการเข้ารหัสอักขระที่ยังใช้งานได้ซึ่งเข้ากันได้กับ ASCII หรือ EBCDIC หรือไม่
dan04

8
@ dan04 ไม่มีที่ฉันรู้จัก แต่ในความเป็นจริงมันอาจจะง่ายเหมือนสาขา "การเข้ารหัสที่ไม่รู้จักการพิมพ์ข้อความแสดงข้อผิดพลาด"

8
'A' ยังเป็น 0xC1 ในการเข้ารหัสอักขระ Apple II DOS 3.3 ซึ่งเป็น ASCII หรือด้วย 0x80
Damian Yerrick

2
@Rhymoid มีโอกาสดีที่ Microsoft จะนำ C11 มาใช้ก่อนที่จะรองรับ C99 พวกเขาเป็นหนึ่งในผู้ผลิตที่ผลักดันให้กลับกับยากที่จะใช้ C99 มีสองซึ่งจะไม่มีผลบังคับใช้ใน C11 en.wikipedia.org/wiki/...
Steve Cox

11

เห็นครั้งแรกอาจดูเหมือนว่ารหัสตาย แต่ 'A' == 0x41 ไม่ได้คืนจริงเสมอไป ..

สิ่งที่นักพัฒนาพยายามทำที่นี่คือการค้นหาอย่างเกียจคร้านว่าการเข้ารหัสคืออะไรเครื่องที่ใช้ASCIIหรือตัวแปรใด ๆ ของEBCDIC

ตามที่ @Richard แนะนำ Capital aถูกแมปกับ0xc1ในInternational - Extended Binary Coded Decimal Interchange Code ดูตารางด้านล่างใน 2 สาขาของ if else ...

ป้อนคำอธิบายภาพที่นี่

ASCII สามารถหาค่าอื่นที่แตกต่างกันได้สำหรับ exmaple:

ป้อนคำอธิบายภาพที่นี่

เขาก็ทำได้เช่นกัน:

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

ในย่อหน้าที่สอง - คุณหมายถึง EBCDIC แทน EBDIC หรือไม่?
Zze
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.