सवाल दुगना है: सबसे पहले, है
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_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 रूपांतरण पर लागू होता है जो असाइनमेंट पर होता है :
- अन्यथा, नए प्रकार पर हस्ताक्षर किए गए हैं और इसमें मूल्य का प्रतिनिधित्व नहीं किया जा सकता है; या तो परिणाम कार्यान्वयन-परिभाषित है या कार्यान्वयन-परिभाषित संकेत उठाया जाता है।
या, यदि 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
वेतन वृद्धि के बाद का मूल्य होगा ।