int foo(char c)
{
  switch(c)
  {
    case '1':
     return(1);
    case '2':
    return(2);
  } 
}

int main()
{
cout << foo('a');
}

यह प्रोग्राम 97 प्रिंट करता है।

** यह ASCII मान को आउटपुट के रूप में प्रिंट करता है यदि स्विच केस में से कोई भी मेल नहीं खाता है। यदि कोई भी मामला मेल नहीं खाता है तो फ़ंक्शन ASCII मान क्यों लौटा रहा है **

-3
Kishore 27 जुलाई 2017, 11:54
3
अपरिभाषित व्यवहार। आपको हमेशा एक मूल्य वापस करना होगा;
 – 
user2672107
27 जुलाई 2017, 11:55
1
और यदि switch में से कोई भी मामला मेल नहीं खाता है, तो आप foo से क्या लौटाते हैं? ऐसा करने के लिए घोषित किसी फ़ंक्शन से कुछ भी वापस नहीं करना जो अपरिभाषित व्यवहार की ओर ले जाता है, जो पूरे कार्यक्रम को अनियमित और अमान्य बनाता है।
 – 
Some programmer dude
27 जुलाई 2017, 11:55
1
return को एक फंक्शन की तरह न बनाएं।
 – 
Sourav Ghosh
27 जुलाई 2017, 11:59
कृपया कंपाइलर चेतावनियां सक्षम करें। चेतावनी C4715: 'foo': सभी नियंत्रण पथ एक मान नहीं लौटाते हैं
 – 
Weather Vane
27 जुलाई 2017, 12:01
1
फिर भी मैं अपने बयान पर कायम रहूंगा। वाईएमएमवी। :)
 – 
Sourav Ghosh
27 जुलाई 2017, 12:12

3 जवाब

आपका प्रोग्राम व्यवहार अपरिभाषित है: int (main के अलावा) को वापस करने वाले किसी भी फ़ंक्शन पर आपके पास एक स्पष्ट वापसी मान होना चाहिए।

(आप जो देख रहे हैं वह स्टैक का भ्रष्टाचार है; 97 लोअर केस लेटर a के लिए ASCII मान है जिसे आपने फ़ंक्शन पैरामीटर के रूप में पास किया है)।

2
Bathsheba 27 जुलाई 2017, 11:58
Iam DEV c++ में चल रहा है, यह बिना किसी त्रुटि के चलता है और आउटपुट प्रिंट करता है
 – 
Kishore
27 जुलाई 2017, 12:00
1
@किशोर: बिल्कुल: यह अपरिभाषित व्यवहार का एक स्वीकार्य अभिव्यक्ति है।
 – 
Bathsheba
27 जुलाई 2017, 12:00
अब मुझे लगता है कि आउटपुट स्टैक के भ्रष्टाचार के कारण है। लेकिन क्या इसे एक त्रुटि वापस नहीं करनी चाहिए क्योंकि "एक गैर शून्य समारोह के अंत तक पहुंच गया"
 – 
Kishore
27 जुलाई 2017, 12:05
2
संकलक आपको यह बताता है। सी में ही कोई अंतर्निहित त्रुटि जांच नहीं है।
 – 
Weather Vane
27 जुलाई 2017, 12:07
अब मैंने कंपाइलर चेतावनी को सक्षम कर दिया है। बहुत - बहुत धन्यवाद
 – 
Kishore
27 जुलाई 2017, 12:15

आपके पास यहां क्या है यूबी है। foo फ़ंक्शन को एक इनपुट मिलता है जिसे वह हैंडल नहीं करता है, क्योंकि आपका कोई भी केस इनपुट 'a' का समर्थन नहीं करता है। संभवतः हुड के नीचे क्या हो रहा है (यदि मैं आपके विशिष्ट मामले में इस यूबी को समझाने की कोशिश कर सकता हूं) यह है कि foo इनपुट को int पर डाला जाता है, जिसका अर्थ है cout << (int)('a');

ऐसे मामलों के लिए आपके स्विच केस में default होना चाहिए, उदाहरण के लिए:

int foo(char c)
{
  switch(c)
  {
    case '1':
      return(1);
    case '2':
      return(2);
    default:
      return (-1); // indicates error!!
  } 
}

int main()
{
int tmp = foo('a');
if (tmp != -1)
    cout << tmp;
else
    cout << "bad input";
}
1
CIsForCookies 27 जुलाई 2017, 12:05
int foo(char c) {
    switch(c) {
        case '1':
          return(1);
        case '2':
          return(2);

        //code to execute if 'c' does not equal the value following any of the cases
        default:
          return(-1);
    } 
}

int main() {
    cout << foo('a');
}

या

// simple char to int without switch
int foo(char c) {

   /*
   // reject unwanted char 
   if (c=='a') {
       return -1;
   }
   */

   // convert char to int
   return (int)c;
}
1
Ihdina 5 अगस्त 2017, 17:27