सवाल दुगना है: सबसे पहले, है
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)सिवाय इसके कि लैवल्यू E1का केवल एक बार मूल्यांकन किया जाता है, और एक अनिश्चित-अनुक्रम अनुक्रम फ़ंक्शन कॉल के संबंध में, एक यौगिक असाइनमेंट का संचालन एक एकल मूल्यांकन है। यदि E1एक परमाणु प्रकार है, तो यौगिक असाइनमेंट memory_order_seq_cstमेमोरी ऑर्डर शब्दार्थ के साथ एक रीड-संशोधित-राइट-ऑपरेशन है । 113)
फिर, सवाल यह है कि क्या होता है c = c + 1। यहाँ ऑपरेंड के लिए +हमेशा की तरह गणित रूपांतरण से गुजरना है, और cऔर 1इसलिए करने के लिए प्रोत्साहित कर रहे हैं int, जब तक कि एक वास्तव में निराला वास्तुकला की आवश्यकता है कि charकरने के लिए प्रोत्साहित किया जाता है unsigned int। +तब की गणना का मूल्यांकन किया जाता है, और परिणाम int/ प्रकार unsigned intको वापस में बदल दिया जाता है charऔर संग्रहीत किया जाता है c।
हैं 3 कार्यान्वयन से परिभाषित तरीकों से इस तो मूल्यांकन किया जा सकता:
CHAR_MIN0 है और इसलिए 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 रूपांतरण पर लागू होता है जो असाइनमेंट पर होता है :
- अन्यथा, नए प्रकार पर हस्ताक्षर किए गए हैं और इसमें मूल्य का प्रतिनिधित्व नहीं किया जा सकता है; या तो परिणाम कार्यान्वयन-परिभाषित है या कार्यान्वयन-परिभाषित संकेत उठाया जाता है।
या, यदि if sizeof (int) == 1 और char हस्ताक्षर किए गए हैं, तो a charमें पदोन्नत किया जाता है int, और CHAR_MAX == INT_MAX=> CHAR_MAX + 1एक पूर्णांक अतिप्रवाह का कारण होगा और व्यवहार अपरिभाषित होगा ।
यानी संभावित परिणाम हैं:
यदि charकोई अहस्ताक्षरित पूर्णांक प्रकार है, तो परिणाम हमेशा होता है 0, अर्थात CHAR_MIN।
अन्यथा charएक हस्ताक्षरित पूर्णांक प्रकार है, और व्यवहार कार्यान्वयन-परिभाषित / अपरिभाषित है:
CHAR_MIN या कुछ अन्य कार्यान्वयन-परिभाषित मूल्य,
- कार्यान्वयन-परिभाषित संकेत उठाया जाता है, संभवतः कार्यक्रम को समाप्त कर रहा है,
- या जहां कुछ प्लेटफार्मों पर व्यवहार अपरिभाषित है
sizeof (char) == sizeof (int)।
सभी वेतन वृद्धि के संचालन c = c + 1, c += 1, c++और ++cएक ही मंच पर एक ही दुष्प्रभाव हो। अभिव्यक्ति का मूल्यांकन मूल्य वृद्धि c++से cपहले का मूल्य होगा ; अन्य तीन के लिए, यह cवेतन वृद्धि के बाद का मूल्य होगा ।