คำถามคือสองเท่า: ประการแรกคือ
char c = CHAR_MAX;
c += 1;
ประเมินแตกต่างจาก
char c = CHAR_MAX;
c = c + 1;
และคำตอบคือไม่มันไม่ใช่เพราะC11 / C18 6.5.16.2p3 :
- การกำหนดแบบผสมของแบบฟอร์ม
E1 op = E2
นั้นเทียบเท่ากับการแสดงออกแบบง่าย ๆE1 = E1 op (E2)
ยกเว้นว่าค่า lvalue E1
จะถูกประเมินเพียงครั้งเดียวและสำหรับการเรียกใช้ฟังก์ชันตามลำดับแบบไม่กำหนดการดำเนินการของการมอบหมายแบบผสมเป็นการประเมินแบบครั้งเดียว หากE1
มีประเภทอะตอมการกำหนดผสมเป็นการดำเนินการอ่าน - แก้ไข - เขียนด้วยซีแมนทิกส์memory_order_seq_cst
ลำดับความจำ 113)
c = c + 1
จากนั้นคำถามคือสิ่งที่เกิดขึ้นใน ที่นี่ถูกดำเนินการที่จะ+
ได้รับการแปลงทางคณิตศาสตร์ตามปกติและc
และ1
ดังนั้นจึงมีการส่งเสริมการint
เว้นแต่สถาปัตยกรรมที่แปลกประหลาดจริงๆต้องการให้มีการเลื่อนตำแหน่งให้เป็นchar
unsigned int
การคำนวณ+
จะถูกประเมินแล้วและผลที่ได้จากประเภทint
/ unsigned int
จะถูกแปลงกลับไปและเก็บไว้ในchar
c
การกำหนดการนำไปปฏิบัติมี3วิธีซึ่งสิ่งนี้สามารถประเมินได้
CHAR_MIN
เป็น 0 และchar
ไม่ได้ลงนามดังนั้น
อย่างใดอย่างหนึ่งchar
คือการส่งเสริมไปแล้วint
หรือunsigned int
และหากมีการส่งเสริมให้int
แล้วCHAR_MAX + 1
จำเป็นจะพอดีกับint
เกินไปและจะไม่ล้นหรือถ้าunsigned int
มันอาจจะพอดีหรือห่อรอบให้เป็นศูนย์ เมื่อค่าผลลัพธ์ซึ่งเป็นตัวเลขทั้งCHAR_MAX + 1
หรือ0
หลังจากการลดแบบโมดูโลกลับไปที่c
หลังจากการลดแบบโมดูโลมันจะกลายเป็น 0 นั่นคือCHAR_MIN
มิฉะนั้นchar
จะได้รับการลงชื่อจากนั้นถ้าCHAR_MAX
น้อยกว่าINT_MAX
ผลลัพธ์ของCHAR_MAX + 1
จะพอดีint
และมาตรฐานC11 / C18 6.3.1.3p3จะใช้กับการแปลงที่เกิดขึ้นเมื่อมีการมอบหมาย :
- มิฉะนั้นจะมีการลงชื่อประเภทใหม่และไม่สามารถแสดงค่าได้ ผลที่ได้คือการดำเนินการที่กำหนดไว้หรือสัญญาณที่กำหนดการดำเนินงานจะเพิ่มขึ้น
หรือIFF sizeof (int) == 1
และ char
มีการลงนามแล้วchar
จะส่งเสริมให้int
และCHAR_MAX == INT_MAX
=> CHAR_MAX + 1
จะทำให้เกิดการล้นจำนวนเต็มและพฤติกรรมจะไม่ได้กำหนด
นั่นคือผลลัพธ์ที่เป็นไปได้คือ:
การดำเนินงานที่เพิ่มขึ้นทั้งหมดc = c + 1
, c += 1
, c++
และ++c
มีผลข้างเคียงที่เดียวกันบนเวทีเดียวกัน ค่าที่ประเมินของนิพจน์c++
จะเป็นค่าc
ก่อนการเพิ่มขึ้น สำหรับอีกสามค่าจะเป็นค่าc
หลังจากการเพิ่มขึ้น