2013-08-22 6 views
7

एक सवाल एक बहु विकल्प परीक्षा में पूछा गया था: क्या निम्नलिखित कार्यक्रम के उत्पादन में हो जाएगा:टर्बो सी ++: प्रिंटफ प्रिंट अपेक्षित मान क्यों करता है, जब कोई चर नहीं पारित किया जाता है?

#include <stdio.h> 

int main(void) 
{ 
    int a = 10, b = 5, c = 2; 

    printf("%d %d %d\n"); 

    return 0; 
} 

और विकल्प 10 के विभिन्न क्रमपरिवर्तन, 5, और 2. किसी कारण थे, यह काम करता है टर्बो सी ++, जिसे हम कॉलेज में उपयोग करते हैं। हालांकि, यह gcc के साथ संकलित नहीं होता है (जो चेतावनी देता है -Wall सक्षम है) या क्लैंग (जिसमें -फॉर्मैट सक्षम है और डिफ़ॉल्ट रूप से चेतावनी देता है) या दृश्य C++ में। आउटपुट, अनुमान के रूप में, कचरा मूल्य है। मेरा अनुमान है कि इस तथ्य के साथ कुछ करना है कि या तो टर्बो सी ++ 16-बिट है, और 32-बिट विंडोज एक्सपी पर चल रहा है, या मानकों की बात करते समय टीसीसी भयानक है।

+9

आउटपुट सचमुच कुछ भी हो सकता है, क्योंकि इस कोड के परिणामस्वरूप अपरिभाषित व्यवहार होता है। –

+1

हाँ पूरी कंपाइलर चीज एक लाल हेरिंग है। –

+0

जीसीसी प्रारूप विनिर्देशक में चर नाम, उदाहरण printf ("% d", x) की आवश्यकता होनी चाहिए; यदि printf कुछ मान – sujin

उत्तर

20

कोड undefined behaviour है।

टर्बो सी ++ में, यह सिर्फ इतना है कि तीन चर ढेर जहां लापता printf() तर्क होगा पर सटीक पदों पर रहते हैं। इसके परिणामस्वरूप अपरिभाषित व्यवहार स्वयं को "सही" मान मुद्रित करके प्रकट होता है।

हालांकि, आप इस मामले पर उचित रूप से भरोसा नहीं कर सकते हैं। यहां तक ​​कि आपके निर्माण पर्यावरण में थोड़ी सी भी बदलाव (जैसे विभिन्न कंपाइलर विकल्प) चीजों को मनमाने ढंग से खराब तरीके से तोड़ सकता है।

+0

धन्यवाद, यह समझ में आता है। मैंने लिनक्स पर कई बार एक ही कार्यक्रम (जीसीसी के साथ संकलित) की कोशिश की, और स्पष्ट रूप से यह संयोग दुर्लभ है। क्या संयोग है कि वे सटीक स्टैक स्थितियों में हैं जो printf को Windows XP पर 16-बिट प्रोग्राम चलाने के तरीके के साथ कुछ करने की आवश्यकता है? कुछ स्मृति की तरह कुछ विशेष रूप से एक कार्यक्रम चलाने के लिए आरक्षित है? – SgrA

+0

@ एसआरजीए: इस कार्यक्रम के लिए आपके द्वारा वर्णित तरीके से व्यवहार करने के लिए कुछ सितारों को संरेखित करना होगा। यह कहना बहुत आसान होगा कि यह XP की वजह से है, या क्योंकि प्रोग्राम 16-बिट है। – NPE

+0

दिलचस्प बात यह है कि यह टर्बो सी ++ में हर बार ऊपर वर्णित कार्य करता है, लेकिन इसके बाहर कभी नहीं, जो मुझे उत्सुक बनाता है। – SgrA

4

यह undefined behaviour है। तो यह कुछ भी हो सकता है।

उपयोग करने के लिए

printf("%d %d%d", a,b,c) 

कारण का प्रयास करें: - स्थानीय चर उन्हें एक ही वे किस क्रम में स्टैक में सौंपा गया में देखता है ढेर और टर्बो सी ++ में printf पर कहा जाता है।

सुझाव (टिप्पणी से): -

समझना कारण है कि यह एक विशेष संकलक के साथ एक खास तरह की समस्याओं का निदान करने में उपयोगी हो सकता है में व्यवहार करती है, लेकिन जानकारी के किसी भी अन्य उपयोग नहीं करते हैं।

+0

हाँ, मुझे विश्वास है कि आउटपुट कुछ भी हो सकता है। मैं जानना चाहता हूं कि यह टर्बो सी ++ में बिल्कुल क्यों काम करता है। – SgrA

+0

एनपीई ने कारण दिया है जो शायद सबसे अच्छा है !!! :) –

+0

@ एसआरजीए: - कारण के साथ मेरा जवाब अपडेट किया गया हालांकि एनपीई ने इसे बेहतर समझाया है !!! :) –

4

यहां जवाब यह है कि कार्यक्रम कुछ भी कर सकता है - यह अपरिभाषित व्यवहार है। printf() रों प्रलेखन के अनुसार (जोर मेरा):

डिफ़ॉल्ट रूप से, तर्क दिया है, जहां प्रत्येक '*' और प्रत्येक रूपांतरण विनिर्देशक अगले तर्क के लिए पूछता है (क्रम में उपयोग किया जाता है और यह अगर एक त्रुटि है अपर्याप्त रूप से कई तर्क दिए गए हैं)

यदि आपके एकाधिक-विकल्प परीक्षण में "अपरिभाषित व्यवहार" के लिए कोई विकल्प नहीं है तो यह एक दोषपूर्ण परीक्षण है। अपरिभाषित व्यवहार के प्रभाव में, कोई भी ऐसे बहु-विकल्प परीक्षण प्रश्न पर उत्तर तकनीकी रूप से सही है।

3

वास्तव में क्या चल रहा है यह है कि तर्क सामान्य रूप से कॉल स्टैक पर पारित होते हैं। स्थानीय चर भी कॉल स्टैक पर पास हुए हैं, और इसलिए printf() उन मानों को देखता है, जो भी संकलक ने उन्हें वहां स्टोर करने का निर्णय लिया था।

यह व्यवहार है, साथ ही कई अन्य लोगों, अपरिभाषित behavoir

+0

आपका मतलब है "स्थानीय चर भी कॉल स्टैक पर पास किए गए हैं" के बजाय "स्थानीय चर भी ढेर पर रखा जाता है" ... – Floris

2

नहीं, यह वास्तुकला से संबंधित नहीं है की छतरी के नीचे की अनुमति है। यह टर्बोसी ++ स्टैक को कैसे संभालता है उससे संबंधित है। चर a, b, और c स्थानीय हैं और इस तरह के ढेर में आवंटित हैं। printf भी ढेर में मूल्यों की अपेक्षा करता है। जाहिर है, स्थानीय लोगों के बाद टर्बोसी ++ स्टैक पर कुछ भी नहीं जोड़ता है और printf उन्हें पैरामीटर के रूप में लेने में सक्षम है। बस संयोग

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

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