2011-03-27 18 views
19
#include <iostream> 

int main(int argc, char** args) { 
    int foo = foo + 4; 
    std::cout << foo << std::endl; 
} 

और एक अनुवर्ती प्रश्न, क्या इस तरह की चीज़ को रोकने के लिए एक कंपाइलर ध्वज है? मैंने पाया - कभी-कभी काम करता है, इसे पूरी तरह से रोकने के लिए बेहतर होगा।इसका क्या अर्थ है? int foo = foo + 4;

My compiler: 
g++ -v 
Using built-in specs. 
Target: i486-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu 
Thread model: posix 
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) 
+1

किस प्रकार की चीज़ को रोकने के लिए एक कंपाइलर ध्वज? – tkerwin

+1

आपका प्रश्न वास्तव में क्या है? आप foo प्रारंभ क्यों नहीं करते? – mbx

+0

'int foo = foo + 4; 'इसका मतलब कुछ भी नहीं है। जब आपने इसे लिखा था तो आपका क्या मतलब था? –

उत्तर

30

इस तरह की चीज़ को रोकने के लिए कोई गारंटीकृत तरीका नहीं है। यह सी ++ और सी का एक अभिन्न अंग है कि परिवर्तक का नाम इसके प्रारंभिक में दिखाई देता है। यह आप के रूप में

T *t = malloc(sizeof(*t)); 

वहाँ सी ++ मुद्दों साधारण मामलों में निदान की आवश्यकता के लिए सूची पर कोई समस्या रिपोर्ट है, लेकिन वर्तमान में compilers अपने मामले का निदान करने की आवश्यकता नहीं है इस तरह के काम करने की अनुमति देता है।

यह भी मान्य है in a different context

संपादित करें: स्पष्टीकरण के लिए - आपके स्निपेट का व्यवहार अपरिभाषित है: आप प्रारंभिक चर के मान को पढ़ रहे हैं। उस कंपाइलरों को इसका निदान करने की आवश्यकता नहीं है इसका मतलब यह नहीं है कि व्यवहार परिभाषित किया गया है।

+0

यह समझ में आता है। मुझे स्वीकार करने के लिए 8 मिनट इंतजार करना है .... – Eric

+3

+1, हमेशा litb से कुछ नया सीखना! – Xeo

3

मैं शर्त लगा सकता हूं कि यह अनिर्धारित व्यवहार है।

संपादित करें: answer to another question से उद्धरण देखें।

संपादित करें: सबसे अधिक संभावना है कि आरएचएस में मूल्य स्टैक में अनियमित स्मृति स्थान से लिया जाता है, 4 इसमें जोड़ा जाता है और परिणाम प्रारंभिकरण के लिए उपयोग किया जाता है।

+0

@downvoter: समझाने की देखभाल? – Vlad

+0

@ नवाज: यह नहीं कहता कि उत्तर में क्या गलत है। बीटीडब्लू, मैंने जो लिंक प्रदान किया है, उसके उद्धरण ने जवाब को सही ठहराया है। – Vlad

+0

@Vlad: हम्म .. आप सही हैं। मैंने अपने डाउनवोट को पूर्ववत करने की कोशिश की, लेकिन इसके लिए आपको अपनी पोस्ट संपादित करनी है, क्योंकि यह मुझे पूर्ववत नहीं करने दे रहा है! – Nawaz

6
int foo = foo + 4; 

यह अनिर्धारित व्यवहार है। कुछ कंपाइलर्स स्वचालित रूप से स्थानीय चर के लिए स्थान शून्य करते हैं जब अन्य नहीं हो सकते हैं, इसलिए foo में स्टैक का कचरा

+0

@downvoter: अपने डाउनवोट को समझाएं – BlackBear

+0

@ नवाज: @ जोहान्स का जवाब सही कहता है: अपरिभाषित व्यवहार – BlackBear

+0

@ ब्लैकबियर: हम्म .. आप सही हैं। मैंने अपने डाउनवोट को पूर्ववत करने की कोशिश की, लेकिन इसके लिए आपको अपनी पोस्ट संपादित करनी है, क्योंकि यह मुझे पूर्ववत नहीं करने दे रहा है! – Nawaz

0

हो सकता है कि मैं किसी भी अर्ध-मार्ग सभ्य कंपाइलर को int foo = foo + 4 के लिए चेतावनी जारी करने की अपेक्षा करूंगा; इसकी डिफ़ॉल्ट कॉन्फ़िगरेशन में। अच्छे लोगों के पास इसे पूरी तरह से अस्वीकार करने के विकल्प होंगे "अनियंत्रित चर का उपयोग" और/या किसी भी विशिष्ट अवसर को स्वीकार करने के लिए जहां प्रोग्रामर समझता है कि क्या हो रहा है और अप्रत्याशित व्यवहार के बारे में चिंतित नहीं है।

मैं अक्सर लिखने के लिए प्रयोग किया जाता है, उदाहरण के लिए पूर्णांक टॉगल = टॉगल^1 दिन गए जब compilers, तो उधम मचाते नहीं थे, तो सब मैं चाहता था एक टॉगल स्विच था जहाँ मैं परवाह नहीं है कि क्या यह सही शुरू कर दिया या उन्हें पुनः असत्य। आजकल मैं शायद स्थिर बूल टॉगल = TRUE लिखूंगा; टॉगल =^टॉगल

2

इस विशेष कोड के लिए जीसीसी से एक चेतावनी प्राप्त करने के लिए, आप की जरूरत -Wuninitialized (-Wall यह भी शामिल है) और-O (या 0 के ऊपर किसी भी अनुकूलन स्तर)।

कारण यह है कि जीसीसी अनियमित चर के उपयोग का निदान नहीं कर सकता है जब तक यह डेटा प्रवाह विश्लेषण नहीं करता है, और ऑप्टिमाइज़ेशन अक्षम होने पर यह डेटा प्रवाह विश्लेषण नहीं करता है। और डिफ़ॉल्ट रूप से अनुकूलन अक्षम है।

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