2012-07-11 12 views
9

मुझे आश्चर्य है कि क्या एक्स निम्न प्रोग्राम में शून्य तक पहुंच जाएगा या नहीं।बार-बार "x << = 1" द्वारा स्थानांतरित होने के बाद मूल्य 0 होगा?

पर विचार करें:

int main() 
{ 
    int x = 1; 
    while (x) 
     { 
     x <<= 1; 
     } 
    return 0; 
} 

इस कार्यक्रम का अपेक्षित व्यवहार सामान्य रूप से बाहर निकलते समय या हमेशा के लिए पाशन होना चाहिए?

+1

इसे अपने लिए आज़माएं! :) – Wires77

+13

कोशिश करना हर समय काम नहीं करता है। विशेष रूप से अपरिभाषित व्यवहार के साथ। –

+2

'int' के बजाय 'हस्ताक्षरित int' का उपयोग करें और यह काम करेगा। –

उत्तर

18

न तो (या दोनों), x अतिप्रवाह होने पर यह अनिर्धारित व्यवहार में चलता है।

C99 कल्पना खंड 6.5.7 का कहना है:

ई 1 का परिणाम < < E2 E1 छोड़ दिया स्थानांतरित E2 बिट पदों है; खाली बिट्स शून्य से भरे हुए हैं। यदि ई 1 में एक हस्ताक्षरित प्रकार है, तो परिणाम का मान E1 × 2 E2 है, परिणाम प्रकार में अधिकतम मान से अधिक मॉड्यूलो को कम किया गया है। यदि ई 1 पर हस्ताक्षर किए गए प्रकार और nonnegative मान हैं, और E1 × 2 E2 परिणाम प्रकार में प्रतिनिधित्व योग्य है, तो यह परिणामस्वरूप मान है; अन्यथा, व्यवहार अपरिभाषित है।

+2

त्वरित उत्तर के लिए धन्यवाद। यह जीसीसी -4.8 के साथ हमेशा के लिए loops, लेकिन सामान्य रूप से उन सभी अन्य कंपाइलरों के साथ बाहर निकलता है जो मैंने कोशिश की है (क्लैंग, आईसीसी, जीसीसी -4.7)। – user1519088

+2

@ user1519088 आपके लिए अपरिभाषित व्यवहार है :) –

+2

+1, हालांकि पूर्णता के लिए यह 'हस्ताक्षरित int' के व्यवहार को इंगित करने के लायक हो सकता है, जो शायद ओपी के * इच्छित * प्रश्न का उत्तर देगा। –

संबंधित मुद्दे