2013-08-27 7 views
8

linux/कर्नेल/signal.c में यह पायाडिफ़ॉल्ट खंड

switch (_NSIG_WORDS) { 
default: 
    for (i = 1; i < _NSIG_WORDS; ++i) { 
     x = *++s &~ *++m; 
     if (!x) 
      continue; 
     sig = ffz(~x) + i*_NSIG_BPW + 1; 
     break; 
    } 
    break; 

case 2: 
    x = s[1] &~ m[1]; 
    if (!x) 
     break; 
    sig = ffz(~x) + _NSIG_BPW + 1; 
    break; 

case 1: 
    /* Nothing to do */ 
    break; 
} 

हो सकता है कि यह काफी अच्छा उदाहरण नहीं है, लेकिन मैं नहीं समझ सकता है कि यह कैसे काम करता है और क्या लीनुस के लिए प्रेरित किया स्विच स्टेटमेंट के सामने डिफ़ॉल्ट-अनुभाग डालने के लिए।

+0

'x = * ++ s & ~ * ++ m;' == 'x = (* (++ s)) और (~ (* (++ m)));' ..'default: 'यदि आप आखिरी बार नहीं लिखते हैं तो किसी भी अन्य मामले की तरह आपको' ब्रेक 'जोड़ने की ज़रूरत है, इसी कारण से हम अन्य मामले –

उत्तर

10

case कोड में switch ब्लॉक के भीतर लेबल का कोई भी अधिकार नहीं है जिसके साथ कोई निष्पादित किया जाता है। default लेबल निष्पादित किया गया है यदि case मैचों या यह case से ऊपर है। इसे कोड बेस में पहले रखने से यह नहीं बदला जाता है।

default होने का एक फायदा यह है कि case इसके ऊपर गलती से या जानबूझकर default तक गिरना असंभव है। इसका अर्थ यह है कि default चलाएगा, और केवल तभी, यदि switch ब्लॉक में मान case स्टेटमेंट से मेल नहीं खाता है।

बेहद pedantic होने के लिए आप अभी भी लेबल को एक स्पष्ट goto के साथ दबा सकते हैं। हालांकि यह बहुत दुर्लभ है।

+1

सुनिश्चित नहीं हैं कि मुझे उत्तर के दूसरे भाग के लिए तर्क मिल रहा है या नहीं। धारणा यह है कि किसी अन्य मामले की तुलना में डिफ़ॉल्ट रूप से गिरना अधिक खतरनाक है? – Ziffusion

+3

@ ज़िफ्यूजन तर्क निम्नानुसार है: लोग मानते हैं कि 'डिफ़ॉल्ट' केवल तभी मारा जाना चाहिए जब कोई मिलान मूल्य न हो। इसे शीर्ष पर रखकर यह सत्यापित करने के लिए दृष्टिहीन रूप से आसान बनाता है वास्तव में यह मामला है। यह भविष्य के जोड़ों को भी बनाता है जो 'डिफ़ॉल्ट' के बारे में धारणा के माध्यम से गिरते हैं और उल्लंघन करते हैं। नोट मैं यह नहीं कह रहा हूं कि मैं इसके साथ सहमत हूं, यह केवल तर्क है कि अन्य ने मुझे पिछले – JaredPar

+1

में प्रस्तुत किया है, आपको बहुत धन्यवाद, @ जेरेडपायर, मैंने सोचा कि स्विथ-केस 'if (' a ') {/ * कुछ * /} और अगर ('बी') {/ * कुछ और * /} अन्य {/ * काफी अन्य * /} ', और 'डिफ़ॉल्ट' खंड पिछले' else' की तरह कुछ है अगर '.. (.. ।) '। मुझे लगता है कि यह सी भाषा का एक महत्वपूर्ण पहलू है, इसलिए आपको फिर से धन्यवाद। – Netherwire