2015-11-13 10 views
5

मुझे पता है कि यह कोड "अपेक्षित" के रूप में काम नहीं करता है। बस इस कोड पर जल्दी की तलाश में, हमें लगता है कि वापसी मान 1 होना चाहिए, लेकिन निष्पादन में यह रिटर्न 3.स्विच में गलत एकाधिक मामले संकलक त्रुटि उत्पन्न नहीं करते

// incorrect 
variable = 1; 
switch (variable) 
{ 
    case 1, 2: 
    return 1; 
    case 3, 4: 
    return 2; 
    default: 
    return 3; 
} 

वापस आती है और वहाँ कुछ सही विकल्प यह करने के लिए कर रहे हैं:

// correct 1 
variable = 1; 
switch (variable) 
{ 
    case 1: case 2: 
    return 1; 
    case 3: case 4: 
    return 2; 
    default: 
    return 3; 
} 

या

// correct 2 
switch (variable) 
{ 
    case 1: 
    case 2: 
    return 1; 
    case 3: 
    case 4: 
    return 2; 
    default: 
    return 3; 
} 

यह आंशिक रूप से Multiple Cases in Switch:

में उत्तर दिया जाता है मैं करूंगा यह जानना कि गलत फॉर्म त्रुटि या यहां तक ​​कि चेतावनियों के बिना संकलित क्यों करता है (कम से कम बोर्लैंड सी ++ कंपाइलर में)।

उस कोड में संकलक क्या समझता है?

+3

मूल्य होता है की वजह से case 2: के बराबर [कैसे अल्पविराम ऑपरेटर काम करता है?] (Http: // stackoverflow। कॉम/प्रश्न/54142/कैसे-करता-द-कॉमा-ऑपरेटर-काम) –

उत्तर

8

बस इस कोड पर जल्दी की तलाश में, हमें लगता है कि वापसी मान 1 होना चाहिए,

मैं कहना चाहता हूँ एक अनुभवी सी ++ डेवलपर तुरंत ध्यान होता है कि कि कुछ गलत है और जल्दी से कुछ अन्य है कि निष्कर्ष निकालना प्रोग्रामर गलती से अल्पविराम ऑपरेटर का उपयोग करने की कोशिश की: ,

लेकिन निष्पादन में यह रिटर्न 3.

रिटर्न

नहीं है, कोड संकलन नहीं चाहिए, क्योंकि मामला अभिव्यक्ति निरंतर

और तथ्य की बात के रूप में नहीं है, यह किसी भी आधे रास्ते आधुनिक संकलक में संकलन नहीं है। उदाहरण के लिए, MSVC 2013 का कहना है:

stackoverflow.cpp(8) : error C2051: case expression not constant 
stackoverflow.cpp(10) : error C2051: case expression not constant 

1, 2 की तरह एक अभिव्यक्ति अल्पविराम ऑपरेटर का एक आवेदन पत्र है, और अल्पविराम ऑपरेटर का तात्पर्य है कि अभिव्यक्ति एक संकलन समय स्थिर नहीं है।

कम से कम सी ++ 11 तक प्रभाव है कि, कोष्ठक जोड़ने अर्थात case (1, 2):, संकलित करने के लिए अनुमति दी जाएगी के लिए साथ और relaxed the rules आया था। यह वही नहीं करेगा जो आप उम्मीद करते हैं। ऐसा कैसे

:

यह आंशिक रूप से स्विच में एक से अधिक मामलों में उत्तर दिया जाता है? वह अन्य प्रश्न और उत्तर सी #+ के बारे में नहीं, लगभग विशेष रूप से सी # के बारे में हैं।

मैं चाहते हैं पता करने के लिए क्यों गलत रूप त्रुटि या घटना चेतावनी (कम से कम Borland C++ कम्पाइलर में) के बिना संकलित करता है।

क्योंकि संकलक बहुत पुराना है। बेहतर एक नया प्राप्त करें।

+1

किसी को बोरलैंड को बग रिपोर्ट जारी करनी चाहिए ... – Walter

+0

@ वाल्टर: आप स्वयंसेवक क्यों नहीं हैं? :) –

3

मेरा अनुमान है कि पहले मामले में संकलक का मूल्यांकन करता है कोड में परिणाम की अल्पविराम ऑपरेटरों इस प्रकार क्रियान्वित किया जा रहा है:

switch(variable) 
{ 
    case 2: 
    return 1; 
    case 4: 
    return 2; 
    default: 
    return 3; 
} 

ऊपर से, क्यों मान 3 इनपुट के लिए दिया जाता है यह देखा जा सकता 1. मेरा सुझाव है कि आप अल्पविराम ऑपरेटर के बारे में पढ़ लें। एसओ से संबंधित कुछ उत्कृष्ट धागे हैं।

+0

पोस्ट करते समय आपका जवाब नहीं देखा। मुझे अपवित्र करने के लिए बाध्य महसूस होता है क्योंकि हमारे उत्तर लगभग समान हैं :) –

+0

@MadPhysicist: मैं इशारा की सराहना करता हूं। सार्वजनिक मंचों पर विनम्र लोग एक बढ़ती दुर्लभता है। हालांकि मैं महसूस कर रहा हूं, जैसा कि आप जितना करते हैं उतना ऊंचा हो। :) – therainmaker

+0

नीचे वोट क्यों लोग? – therainmaker

1

कुछ प्रयोग करें।

#include <stdio.h> 

int test(int variable) { 
    switch (variable) 
    { 
    case 1, 2: 
     return 1; 
    case 3, 4: 
     return 2; 
    default: 
     return 3; 
    } 
} 

int main(void) { 
    int i; 

    for (i = 1; i <= 5; i++) 
    { 
    printf("%d -> %d\n", i, test(i)); 
    } 
    return 0; 
} 

बोर्लेन्ड सी ++ Win32 के लिए 5.5.1 के साथ संकलित, उत्पादन

1 -> 3 
2 -> 1 
3 -> 3 
4 -> 2 
5 -> 3 

यह दर्शाता है कि 1, 22 के रूप में व्याख्या की है और 3, 44 के रूप में व्याख्या की है था।

+0

हम कैसे जानते होंगे कि तुरंत टेस्ट दोहन लिखने के बिना कोड को पढ़ने से? –

3

a, b सी और सी ++ दोनों में एक वैध अभिव्यक्ति है। इसका मतलब है "a का मूल्यांकन करें, इसे छोड़ दें, b का मूल्यांकन करें"। अभिव्यक्ति का मूल्य b है।

variable = 1; 
switch(variable) 
{ 
    case 2: 
    return 1; 
    case 4: 
    return 2; 
    default: 
    return 3; 
} 

अल्पविराम ऑपरेटर के बारे में अधिक के लिए, आप Wikipedia article पढ़ सकते हैं: तो अपने मूल switch निम्नलिखित अर्थ नहीं है।

2

फॉर्म a, b की एक अभिव्यक्ति का मूल्य b है। इस तरह अल्पविराम ऑपरेटर काम करता है।

स्पष्ट रूप से, case 1, 2:case 2: के बराबर है, और इसी तरह।

हालांकि, एक मामले लेबल एक निरंतर अभिन्न अभिव्यक्ति होना चाहिए, और 1, 2नहीं एक निरंतर अभिव्यक्ति है, क्योंकि यह अल्पविराम ऑपरेटर शामिल हैं (सी ++ व्याकरण तय है कि एक निरंतर अभिव्यक्ति अल्पविराम ऑपरेटर को शामिल नहीं कर सकते हैं)। इसलिए आपके कंपाइलर को एक त्रुटि जारी करनी चाहिए।

आप अक्सर देखेंगे case 1: case 2: जो, अनुवर्ती के माध्यम सेswitch के व्यवहार की वजह से, बयान दोनों 1 और 2 के मामलों के लिए चलाने के लिए है कि रेखा निम्नलिखित की अनुमति देगा।

0

सी या सी ++ में, अल्पविराम भाव नियमों का पालन किया है:

  1. बाएं से दाएं संचालन करते हैं।
  2. अल्पविराम अभिव्यक्ति का मूल्य अंतिम अभिव्यक्ति का मूल्य है।

तो कोड case 1,2: तथ्य अल्पविराम अभिव्यक्ति आप जांच करना चाह सकते 2.

+0

मैं वास्तव में हैरान हूं कि बहुत से लोग जवाब देने से पहले कोड को संकलित करने की कोशिश भी नहीं करते हैं। –

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