सवाल एक स्विच मामले में परिवर्तनीय का दायरा [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

मुझे लगता है कि मुझे समझ में नहीं आता कि स्विच केस में स्कोप कैसे काम करता है।

क्या कोई मुझे समझा सकता है कि पहला कोड संकलित क्यों नहीं करता है लेकिन दूसरा करता है?

कोड 1:

 int key = 2;
 switch (key) {
 case 1:
      String str = "1";
      return str;
 case 2:
      String str = "2"; // duplicate declaration of "str" according to Eclipse.
      return str;
 }

कोड 2:

 int key = 2;
 if (key == 1) {
      String str = "1";
      return str;
 } else if (key == 2) {
      String str = "2";
      return str;
 }

वेरिएबल "str" ​​का दायरा केस 1 के भीतर क्यों नहीं आता है?

यदि मैं केस 1 की घोषणा छोड़ देता हूं तो चर "str" ​​कभी घोषित नहीं किया जाता है ...


76
2017-10-08 20:36


मूल




जवाब:


मैं दोहरा दूंगा जो दूसरों ने कहा है: प्रत्येक में चर के दायरे case खंड पूरी तरह से मेल खाता है switch बयान। हालांकि, आप ब्रेसिज़ के साथ आगे घोंसला वाले स्कोप बना सकते हैं:

int key = 2;
switch (key) {
case 1: {
    String str = "1";
    return str;
  }
case 2: {
    String str = "2";
    return str;
  }
}

परिणामस्वरूप कोड अब वैरिएबल नाम से सफलतापूर्वक संकलित होगा str सभी में case खंड अपने दायरे में है।


140
2017-10-08 20:49



इस आदमी को सुनो। वह सही है। - John
सही बात। लेकिन मैं अपनी टीम में किसी भी प्रोग्रामर से बहुत नाराज हूं जो बहुत अच्छे कारण के बिना इस "वाक्यविन्यास" का उपयोग करता है। यह भ्रम और बग के लिए एक नुस्खा है। यह दृष्टि से इस तथ्य को छुपाता है कि पहला मामला ब्लॉक (यदि यह नहीं था return) बंद ब्रेस के बाद भी "जारी है" - और भूलने में मदद करता है break। - leonbloy
इसका भी प्रयोग करें break रखरखाव और बग की रोकथाम के लिए! भले ही आवश्यक नहीं है। - worenga
@mightyuhu ब्रेक काम नहीं करेगा क्योंकि कम से कम जावा के लिए ... सी या सी ++ यह ठीक है ... - Boy
@ बॉय आप शायद सही हैं। हालांकि, यह वास्तव में मेरा मूल बिंदु नहीं था। मुझे लगता है कि उन समयपूर्व रिटर्न में सभी तरह के रख-रखाव और बग मास्कराइडिंग समस्याएं होती हैं जो मृत कोड या चक्रवात जटिलता का उल्लेख नहीं करती हैं। इसलिए एक सामान्य सलाह के रूप में कम से कम ऐसे मामलों में ऐसी संरचनाओं से बचने चाहिए जो कमजोर नहीं हैं - worenga


चर का दायरा पूरा है switch कथन - सभी मामलों और डिफ़ॉल्ट, अगर शामिल है।

यहां कुछ अन्य विकल्प दिए गए हैं ...

विकल्प 1:

int key = 2;
switch (key) {
case 1:
     return "1";
case 2:
     return "2";
}

विकल्प 2:

int key = 2;
String str = null;
switch (key) {
case 1:
     str = "1";
     return str;
case 2:
     str = "2";
     return str;
}

9
2017-10-08 20:40





ऐसा लगता है कि आप प्रत्येक को मानते हैं case एक ब्लॉक है जो अपने स्थानीय दायरे के साथ है, जैसे कि / अन्य ब्लॉक। यह।

इस वैचारिक गलती को सही करना महत्वपूर्ण है, अन्यथा आप भूलने के लगातार जाल में गिरना बंद कर देंगे break के अंदर case


8
2017-10-08 20:43





मुझे लगता है कि यह एक वैध सवाल है, और केस स्टेटमेंट के लिए स्कोप धारणा अपरिहार्य है। अपने आप को समायोजित करना क्योंकि जावा लेखक ने इसे सही नहीं बनाया है।

जैसे यदि डिफ़ॉल्ट रूप से कथन पहले दायरे में पहली पंक्ति लेता है, तो मामले के अंत में जहां गलत है तो ब्रेक स्टेटमेंट द्वारा स्पष्ट रूप से बंद किया जाता है। इसलिए मामले 1 में घोषणा: 2 मामले में उपलब्ध नहीं होनी चाहिए और इसमें समानांतर दायरा है लेकिन घोंसला नहीं है।


2
2017-12-14 10:55





एक स्विच स्टेटमेंट में कई मामलों को निष्पादित किया जा सकता है। इसलिए..


0
2017-10-08 20:40





स्विच के ब्रेसिज़ और कथन के बीच एक चर का दायरा मौजूद है। उदाहरण में कोड 1 स्विच ब्रेसिज़ चर के दोनों घोषणाओं को संलग्न करता है जो संकलक को त्रुटि के कारण बनता है क्योंकि परिवर्तनीय बाध्यकारी के नाम पहले से ही किए जा चुके हैं।

दूसरे उदाहरण में यह ठीक है क्योंकि दोनों चर अपने स्वयं के ब्रेसिज़ (स्कोप) के भीतर घोषित किए जाते हैं।


0
2017-10-08 20:41





पहले मामले में स्ट्रिंग घोषणा का दायरा स्विच स्टेटमेंट के भीतर होता है इसलिए इसे डुप्लिकेट के रूप में दिखाया जाता है जबकि दूसरी स्ट्रिंग घुंघराले ब्रेसिज़ के भीतर संलग्न होती है जो कि / अन्य स्थितियों के दायरे को सीमित करती है, इसलिए यह कोई त्रुटि नहीं है दूसरा मामला


0
2017-10-08 20:43