स्विच स्टेटमेंट में उपयोग जारी है


91

मैं switchनिम्नलिखित कोड में एक बयान के मध्य से लूप स्टेटमेंट पर कूदना चाहता हूं :

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        break;
    default:
        // get another something and try again
        continue;
    }
    // do something for a handled something
    do_something();
}

क्या यह उपयोग करने का एक वैध तरीका है continue? क्या continueबयानों को नजरअंदाज किया जाता switchहै? क्या C और C ++ उनके व्यवहार पर यहाँ भिन्न हैं?


आपका विचार ठीक है लेकिन ऊपर का लूप कभी भी निष्पादित नहीं होगा do_something()
एंटी

5
भले ही नियंत्रण ए या केस बी तक पहुंच जाए?
अलेक्जेंडर पोलुटेकोव

18
मैं कहने जा रहा था, एंटिक उसके बारे में गलत है। ए या बी के मामले में do_something () निष्पादित करेगा। डिफ़ॉल्ट रूप से यह जमानत देगा।
एंटनी वुड्स

3
@ एक्रॉन, वह अभीष्ट व्यवहार है
मैट जॉइनर

1
मुझे लगता है कि यह कहीं अधिक संदिग्ध और भ्रामक लगता है और इसलिए एक से अधिक हानिकारक है goto
फोएगॉन

जवाबों:


57

यह ठीक है, continueबयान संलग्न लूप से संबंधित है, और आपका कोड समान होना चाहिए (ऐसे कूदने वाले बयानों से बचना):

while (something = get_something()) {
    if (something == A || something == B)
        do_something();
}

लेकिन अगर आप breakलूप से बाहर निकलने की उम्मीद करते हैं, जैसा कि आपकी टिप्पणी का सुझाव है (यह हमेशा किसी अन्य चीज़ के साथ फिर से कोशिश करता है, जब तक कि यह गलत का मूल्यांकन नहीं करता है), आपको एक अलग संरचना की आवश्यकता होगी।

उदाहरण के लिए:

do {
    something = get_something();
} while (!(something == A || something == B));
do_something();

2
सिर्फ़ अर्थ अर्थ में 'समतुल्य'। कोड संकलक उत्पन्न बहुत अलग है। एक स्विच स्टेटमेंट के साथ, कंपाइलर एक जंप टेबल उत्पन्न कर सकता है जो कई तुलनाओं से बचता है और इस प्रकार प्रत्येक तत्व 1 के खिलाफ तुलना करने की तुलना में बहुत तेज है।
chacham15

@ chacham15, कंपाइलर दोनों के लिए समान कोड क्यों नहीं बना सका?
अवीकर

@avakar स्विच स्टेटमेंट जंप टेबल उत्पन्न करते हैं जबकि अन्य प्रतिनिधित्व तार्किक मूल्यांकन की एक श्रृंखला है। अधिक जानकारी के लिए गूगल जंप टेबल।
chacham15

@ chacham15, यदि कंपाइलर या स्विच के लिए तार्किक मूल्यांकन की एक श्रृंखला है तो कंपाइलर को दो के लिए एक जंप टेबल बनाने से रोकता है?
अवकर

1
@avakar स्विच स्टेटमेंट के लिए मामलों को निरंतर मूल्यों की आवश्यकता होती है, क्योंकि यदि स्टेटमेंट्स के साथ ऐसा नहीं है, तो यह एक ही ऑप्टिमाइज़ेशन नहीं कर सकता है (ध्यान दें: मैं सामान्य मामले में बोल रहा हूं, यह कुछ आवश्यकताओं को ध्यान में रखते हुए संभव है। , अनुकूलन करने के लिए केवल कुछ तार्किक ऑपरेटरों, आदि), लेकिन यह अत्यधिक संकलक निर्भर और YMMV है)।
चाचम 15

21

हां, यह ठीक है - यह एक ifबयान में इसका उपयोग करने जैसा है । बेशक, आप breakएक स्विच के अंदर से लूप से बाहर निकलने के लिए उपयोग नहीं कर सकते ।


लेकिन या ifके व्यवहार पर कोई प्रभाव नहीं है । आपका क्या मतलब है यह एक जैसा है? continuebreak
मैट जॉइनर

@ मैट का मतलब है कि यह दोनों मामलों में लूप जारी रखेगा।

1
@ नील, ठीक है, भ्रम पैदा हुआ।
मैट जॉइनर

1
@ KiJéy मुझे इसके लिए कोई संदर्भ नहीं मिल रहा है, और C प्रोग्रामिंग के कई वर्षों में मैंने कभी भी ऐसा कोई कंपाइलर नहीं देखा है जो इसका समर्थन करता हो ... धरती पर आपको यह कहां मिला?
अर्जुनयुग

2
सॉरी सॉरी, मैंने इसे PHP में देखा, सोचा कि यह एक पुरानी प्रथा थी, पता चला कि यह सिर्फ PHP है ...
Ki Jéy

15

हां, जारी रखें को स्विच स्टेटमेंट द्वारा अनदेखा किया जाएगा और परीक्षण किए जाने वाले लूप की स्थिति में जाएगा। मैं Ritchie द्वारा सी प्रोग्रामिंग भाषा संदर्भ से इस एक्सट्रैक्ट को साझा करना चाहता हूं:

continueबयान से संबंधित है break, लेकिन कम अक्सर इस्तेमाल किया; यह enclosing की अगले चरण का कारण बनता है for, whileया doपाश शुरू करने के लिए। में whileऔर do, इस का मतलब परीक्षण हिस्सा तुरंत क्रियान्वित किया जाता है कि; में for, नियंत्रण वेतन वृद्धि कदम के लिए गुजरता है।

जारी स्टेटमेंट केवल लूप्स पर लागू होता है, स्टेटमेंट पर नहीं switch। एक continueके अंदर एक switchएक पाश के अंदर अगले पाश यात्रा का कारण बनता है।

मुझे C ++ के बारे में निश्चित नहीं है।


8

यह वाक्यात्मक रूप से सही और शैलीगत रूप से ठीक है।

अच्छी शैली के लिए आवश्यक है कि प्रत्येक case:कथन को निम्नलिखित में से एक के साथ समाप्त होना चाहिए:

 break;
 continue;
 return (x);
 exit (x);
 throw (x);
 //fallthrough

इसके अतिरिक्त, case (x):तुरंत साथ

 case (y):
 default:

अनुमेय है - कई मामलों को बांधना जो बिल्कुल समान प्रभाव रखते हैं।

और कुछ, एक गलती होने का संदेह है जैसे if(a=4){...} बेशक आप संलग्न की जरूरत है पाश ( while, for, do...whileके लिए) continueकाम करने के लिए। यह case()अकेले वापस नहीं आएगा । लेकिन एक निर्माण की तरह:

while(record = getNewRecord())
{
    switch(record.type)
    {
        case RECORD_TYPE_...;
            ...
        break;
        default: //unknown type
            continue; //skip processing this record altogether.
    }
    //...more processing...
}

...ठीक है।


2
नेक्रोपोस्टिंग के लिए खेद है, लेकिन मैं जोड़ूंगा कि exitस्विच केस को समाप्त करने के लिए कॉल भी आमतौर पर एक ठीक बात होगी।
वैधता

1
ठीक है, मैं यहाँ सभी डॉ। फ्रेंकस्टीन जा रहा हूँ और यह भी इंगित default:करता हूँ कि अंतिम / नीचे प्रविष्टि नहीं है - जैसा कि यह प्रश्न बताता है ...
स्लीवेन डिसे

1
@SlySven: लेक्सिकली, यह नहीं है, लेकिन अगर आपके पास इसे बनाने का कोई अच्छा कारण नहीं है, तो इसे अंतिम रूप दें। यह अक्सर भ्रमित होता है यदि अन्य स्थानों पर उपयोग किया जाता है।
एसएफ।

1
@SF। ठीक है, मैं आसानी से उन मामलों की कल्पना कर सकता हूं जब default:मामले को अंतिम के बजाय पहले बनाने के लिए अधिक समझ होगी । जैसे "ऐसा करें, जब तक कि आपको निम्नलिखित असामान्य मूल्य न मिलें, जिन्हें इस प्रकार संभाला जाना चाहिए"।
रुस्लान

5

जबकि तकनीकी रूप से मान्य है, ये सभी कूद नियंत्रण प्रवाह को अस्पष्ट करते हैं - विशेष रूप से continueबयान।

मैं एक आखिरी उपाय के रूप में इस तरह के एक चाल का उपयोग करता हूं, न कि पहले एक।

कैसा रहेगा

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        do_something();
    }        
}

यह छोटा है और अधिक स्पष्ट तरीके से इसके सामान का प्रदर्शन करता है।


1
भ्रम के लिए अलेक्जेंडर, कोड केवल प्रदर्शन के लिए है, मेरे पास मेरे कोड में वास्तविक संरचना के लिए अच्छा कारण (मुझे विश्वास है) है।
मैट जॉइनर

2
@ मैट: इसका मतलब होगा कि एक और अधिक अस्पष्ट संरचना ... :)
आगंतुक

-2

यह देर से मेगाबिट हो सकता है लेकिन आप इसका उपयोग कर सकते हैं continue 2

कुछ php इस चेतावनी का उत्पादन / विन्यास करेंगे:

PHP चेतावनी: "जारी रखें" लक्ष्यीकरण स्विच "ब्रेक" के बराबर है। क्या आप "2 जारी रखें" का उपयोग करने का मतलब है?

उदाहरण के लिए:

$i = 1;

while ($i <= 10) {
    $mod = $i % 4;
    echo "\r\n out $i";
    $i++;
    switch($mod)
    {
        case 0:
            break;
        case 2:
            continue;
            break;
        default:
            continue 2;
            break;
    }
    echo " is even";
}

यह आउटपुट होगा:

out 1
out 2 is even
out 3
out 4 is even
out 5
out 6 is even
out 7
out 8 is even
out 9
out 10 is even

PHP 5.5 और उच्चतर के साथ परीक्षण किया गया।


3
यह एक PHP सवाल नहीं है।
ज्योफ्री

-4

स्विच को लूप के रूप में नहीं माना जाता है ताकि आप स्विच में केस स्टेटमेंट के अंदर जारी न रख सकें ...


3
switchबयान एक के अंदर है whileपाश, इसलिए continueपूरी तरह से वैध है।
रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.