2013-04-19 12 views
9

अंत में मैं एक टाइपो बग का पता लगाता हूं, जो निम्न कोड के समान कुछ है। लेकिन क्या कंपाइलर को यह पता नहीं होना चाहिए (डिफ़ॉल्ट विकल्प से)?संकलक एक वैरिएबल को अपने साथ शुरू करने की अनुमति क्यों देता है?

#include <stdio.h> 

int main() 
{ 
    int c = c; 
    return printf("%d\n", c); 
} 


$ gcc --version   
gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 
+10

प्रारंभिकरण के साथ आप अनिर्धारित व्यवहार का आह्वान करते हैं; संकलक को समस्या का निदान करने की आवश्यकता नहीं है, या इसे परिभाषित करने के लिए यह क्या होता है जब यह सामना करता है। –

+8

मैं अपने बाएं जूते को शर्त लगाता हूं कि जब आप चेतावनियां चालू करते हैं (- जीसीसी में होगा), तो यह आपको चेतावनी देगा जब आप ऐसा कर रहे हों। चेतावनियों को अनदेखा न करने का प्रयास करें ;-) – nothrow

+0

वीसी पता चला है। – BLUEPIXY

उत्तर

7

मुझे नहीं लगता कि यह संकलित क्यों नहीं होगा। प्रारंभिकरण से पहले परिभाषा होती है। बेशक यह प्रारंभिक व्यर्थ है, हालांकि, ऐसा कोई कारण नहीं है कि यह कंपाइलर्स स्टैंड पॉइंट से काम नहीं करेगा।

सी में समान प्रकार की सुरक्षा नहीं है जो अधिक आधुनिक भाषाओं जैसे सी # है। सी # कंपाइलर एक त्रुटि देगा कि आप एक असाइन किए गए चर का उपयोग कर रहे हैं। सी परवाह नहीं है। यह आपको अपने आप से नहीं बचाएगा।

+5

यह प्रारंभिकरण, असाइनमेंट नहीं। –

+5

इसके अलावा, इसके प्रारंभिकरण के लिए चर को संदर्भित करने में सक्षम होना * उपयोगी * है, क्योंकि आप अपना पता ले सकते हैं, जैसे कि int int = startize_and_register (& x) '। (उस प्रकार का आमंत्रण आम तौर पर एक मैक्रो में पैक किया जाएगा।) – user4815162342

+0

@ user4815162342 सच है, जो स्पष्ट रूप से समझ में आता है। मुझे अपने शब्दों को बेहतर तरीके से चुना जाना चाहिए था :( – evanmcdonnal

-3

तो

int c; 
c = c; 

संकलन होगा, मैं देख नहीं क्यों int c = c; संकलन नहीं होगा है।

+7

धोखे से दो समान दिखते हैं, लेकिन वास्तव में अलग हैं: 'int c = ...' असाइनमेंट के बजाय प्रारंभिक है। उदाहरण के लिए, 'int c [] = {1, 2, 3};' काम करता है लेकिन '{1, 2, 3}' असाइनमेंट के संदर्भ में मान्य नहीं है। – delnan

5

अपने चर प्रारंभ में एक चर का उपयोग करना पूरी तरह से वैध है। एक लिंक्ड सूची पर विचार करें:

#include <stdio.h> 
struct node { struct node *prev, *next; int value; }; 
int main() { 
    struct node l[] = {{0, l + 1, 42}, {l, l + 2, 5}, {l, 0, 99}}; 
    for (struct node *n = l; n; n = n->next) 
     printf("%d\n", n->value); 
    return 0; 
} 

सामान्य रूप से, जब कोई मान अनियंत्रित किया जाता है तो निदान करना मुश्किल समस्या है; हालांकि कुछ कंपाइलर्स इसे कुछ मामलों में पहचान सकते हैं, लेकिन ऐसा होने की आवश्यकता के लिए यह समझ में नहीं आता है।

+0

अपरिभाषित व्यवहार कैसे वैध है? – rubenvb

+8

यह अपने आप के साथ एक वैरिएबल को शुरू नहीं कर रहा है, बल्कि इसके लिए एक सूचक है, क्योंकि इस संदर्भ में 'l' एक सूचक 'और [0]' में समाप्त होता है। –

+0

तो यह परिभाषित किया गया है? – this

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

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