คำถามคือสองเท่า: ประการแรกคือ
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จะถูกแปลงกลับไปและเก็บไว้ในcharc
การกำหนดการนำไปปฏิบัติมี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หลังจากการเพิ่มขึ้น