2016-06-03 8 views
20

अस्वीकरण: मुझे पता है कि यह अस्पष्ट है, और मैं ऐसा प्रोग्राम नहीं करूंगा। मुझे इसके बजाय पसंदीदा do-while कथन से अवगत है, प्रश्न एक विशिष्ट भाषा निर्माण की वैधता के बारे में अधिक है।गोटो स्टेटमेंट के साथ लूप के लिए कम से कम एक पुनरावृत्ति को मजबूर करने की वैधता


goto हमेशा सशर्त अभिव्यक्ति for लूप के छोड़ माना जाता है? मैंने जो देखा उससे पहले यह पहले (यानी प्रारंभिक) और दूसरी अभिव्यक्तियों को छोड़ देता है। क्या यह हमेशा ऐसा होता है या यह व्यवहार पूरी तरह से संकलक निर्भर है?

#include <stdio.h> 

int main(void) 
{ 
    int m = 5; 

    goto BODY; 
    for (m = 0; m < 5; m++) 
     BODY: puts("Message"); // prints "Message" once 

    printf("m = %d\n", m); // prints m = 6 

    return 0; 
} 
+5

* "यह पहले दोनों (यानी आरंभ करना) और दूसरी अभिव्यक्ति" * छोड़ देता है। हाँ। * "प्रश्न भाषा निर्माण की वैधता के बारे में अधिक है" * भाषा निर्माण सभी समझदार प्रोग्रामर के लिए अमान्य है, क्योंकि एक ही काम करने के लिए बहुत बेहतर तरीके हैं (और भाषा वकीलों द्वारा अनुमोदन की आवश्यकता नहीं है)। – user3386109

+6

@ user3386109: समझदार या नहीं, ऐसे लोग भी हैं जो सी/सी ++ कंपाइलर्स लिखते हैं और कोई फर्क नहीं पड़ता कि यह कैसा दिखता है, 'गोटो' अभी भी भाषा का हिस्सा है। –

+0

मुझे यह तथ्य नहीं पता है, लेकिन मुझे संदेह है कि एक लूप के शरीर में 'गोटो' (यदि संकलक इसे बिल्कुल अनुमति देता है) परिणामस्वरूप "अपरिभाषित व्यवहार" होता है। –

उत्तर

20

हां, आप m = 0 और m < 5 दोनों पर कूद रहे हैं, और ऐसा होना चाहिए।

for (A; B; C) 
    D; 

A और B के बीच एक बिंदु पर नियंत्रण के हस्तांतरण के लिए कोई तरीका नहीं है

{ 
    A; 
    loop: 
    if (B) 
    { 
     D; 
     C; 
     goto loop; 
    } 
} 

के बराबर है।

अपने पाश के शब्दों वास्तव में यह "विशुद्ध गोटो" संस्करण की तरह कर रहे हैं:

int m = 5; 
goto BODY; 
m = 0; 
loop: 
if (m < 5) 
{ 
    BODY: puts("Message"); // prints "Message" once 
    m++; 
    goto loop; 
} 
printf("m = %d\n", m); // prints m = 6 
2

आप उदाहरण के लिए एक do/while पाश का उपयोग करना चाहिए, यदि आप पाश के लिए निम्नलिखित है:

for(A ; B ; C) 
{ 
    D; 
} 

आप निम्न कर का उपयोग करना चाहिए/जबकि पाश:

A; 
do 
{ 
    D; 
    C; 
}while(B); 

जो होगा पहले पुनरावृत्ति को मजबूर करें।

संपादित

chux द्वारा टिप्पणी देखें: यदि D;continue होता है, इस तरह से काम नहीं करेगा, तो आप एक और तरीका

संपादित द्वितीय

के रूप में प्रश्न संपादित किया गया था की आवश्यकता होगी , यह उत्तर अब प्रश्न का सीधा जवाब नहीं है, लेकिन मैं इसे हटा नहीं सकता क्योंकि यह किसी की मदद कर सकता है ...

+2

यह सही दृष्टिकोण है जब तक 'डी;' में 'जारी नहीं है;' – chux

+0

अच्छा बिंदु, मैं इसे – mame98

+3

ओटीओएच के उत्तर में जोड़ूंगा, ओपी पोस्ट के उद्देश्य को बदल रहा है। सवाल की समीक्षा करना चाह सकते हैं। – chux

2

सी प्रोग्रामिंग में एक गोटो स्टेटमेंट बिना शर्त 'गेटो' से उसी फ़ंक्शन में लेबल किए गए कथन पर कूदता है।

बिना शर्त शब्द पर ध्यान दें।

तो हाँ यह for पाश की सशर्त अभिव्यक्ति को छोड़ना है।

4

अपने कोड में goto बयान एक for अंदर एक बयान के बिना शर्त कूद खड़ी कर रहा है loop.When कि बयान निष्पादित किया जाता है , कार्यक्रम का प्रवाह लूप में सशर्त अभिव्यक्ति पर निर्भर होना चाहिए। इसलिए, लूप के अंदर हां प्रारंभ छोड़ दिया गया है।

2

यह सी में पूरी तरह से कानूनी है। लूप के लिए कूदने में कुछ भी गलत नहीं है जब तक आप स्वचालित रूप से किसी भी घोषणा या प्रारंभिक चर के प्रारंभिकरण को छोड़ नहीं देते हैं।

आपके मामले में, एम एक बार बढ़ी है और रोकथाम की स्थिति को पूरा करने के कारण लूप समाप्त हो जाता है।

6

क्या गोटो को हमेशा लूप के लिए सशर्त अभिव्यक्ति को छोड़ना है?

हां। एक गोटो कूद हमेशा एक बिना शर्त कूद है और निष्पादन लेबल से वहां से ले जाएगा।

C11 मसौदा से, § 6.8.6.1 गोटो बयान:

एक गोटो बयान बयान संलग्नित समारोह में नामित लेबल लगाया जाता है करने के लिए बिना शर्त कूद कारण बनता है।

एकमात्र अपवाद जा रहा है के साथ

:

एक गोटो बयान संलग्न समारोह में कहीं स्थित एक लेबल नाम करेगा में पहचानकर्ता। एक गेटो स्टेटमेंट को उस पहचानकर्ता के दायरे के बाहर एक पहचानकर्ता टाइप करने वाले पहचानकर्ता के दायरे से बाहर नहीं कूदेगा।

+4

क्या आप समझा सकते हैं कि अपवाद का क्या अर्थ है? – user1717828

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