मेरे पास निम्न कोड है:

void takeOrder(void)
{
int stop = 0;
while(stop != 1)
{
    printf("What is your order?\n");
    printf("%c - fruitShake\n%c - milkShake\n", FRUIT_SHAKE_CHOICE, MILK_SHAKE_CHOICE); 
    scanf("%c", &typeChoice); 
    if(typeChoice != FRUIT_SHAKE_CHOICE || typeChoice != MILK_SHAKE_CHOICE)
    {
        printf("***Error! Wrong type***");
        stop = 1;
    }
    //more code below
}

}

मैं "स्टॉप" ध्वज के साथ समय-लूप से बाहर निकलने की कोशिश कर रहा हूं, लेकिन यह काम नहीं करता है और यह बस नीचे दिए गए बाकी कोड के साथ जारी रहता है। क्या ध्वज के साथ और ब्रेक का उपयोग किए बिना इस लूप से बाहर निकलने का कोई तरीका है?

5
Haim Lvov 1 पद 2017, 18:31

3 जवाब

सबसे बढ़िया उत्तर

मुझे लगता है कि एकमात्र तरीका more code below भाग को सशर्त रखना है

 int stop = 0;

 while (stop != 1) {
   if (typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
     stop = 1;
   } else {
     // more code below
   }
 }

फ़ंक्शन का उपयोग करने वाला दूसरा एकमात्र तरीका :

while (doStuff() == 0);

int doStuff(void) {
   if (typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
     return 1;
   } 

   // more code below

   return 0;
}

PS: शायद मैं एक नाज़ी हूं, लेकिन यह निश्चित रूप से एक do ... while होना चाहिए

 int stop = 0;

 do {
   if (typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
     stop = 1;
   } else {
     // more code below
   }
 } while (stop != 1);
6
Orelsanpls 1 पद 2017, 18:48

आप इसे कई तरीकों से कर सकते हैं, जिनमें से सभी break का उपयोग करने से काफी कम हैं:

  • आप else जोड़ सकते हैं और // more code भाग के कोड नेस्टिंग को बढ़ा सकते हैं, या
  • आप अपने पाठकों को भ्रमित करने के लिए वेरिएबल सेट कर सकते हैं और break के बजाय continue का उपयोग कर सकते हैं, या
  • आप एक लेबल जोड़ सकते हैं और अपने सहकर्मियों को क्रोधित करने के लिए goto का उपयोग कर सकते हैं

सबसे अच्छा तरीका है break का उपयोग करना, और stop वैरिएबल को पूरी तरह से छोड़ देना, इसे "फॉरएवर" लूप से बदलना:

for (;;) {
    ...
    if (condition) {
        break;
    }
    ...
}

यह निर्माण उन स्थितियों में मुहावरेदार है जब तीन बिल्ट-इन लूप में से कोई भी आपको विशेष रूप से अच्छा फिट नहीं देता है, अर्थात जब लूप के शीर्ष के विपरीत लूप के बीच में तोड़ने या जारी रखने का निर्णय किया जाता है (जैसा कि में for और while लूप) या लूप के नीचे (जैसे do/while लूप में)।

नोट: जब आप वेरिएबल सेट करते हैं तो आपका कोड लूप को समाप्त नहीं करता है, इसका कारण यह है कि लूप कंडीशन की लगातार जांच नहीं की जाती है। बल्कि, प्रत्येक पुनरावृत्ति शुरू होने से पहले इसे एक बार जांचा जाता है। उसके बाद लूप के शरीर के अंदर किसी भी बिंदु पर स्थिति अमान्य हो सकती है।

9
Sergey Kalinichenko 1 पद 2017, 18:41

पहले बदलें

if(typeChoice != FRUIT_SHAKE_CHOICE || typeChoice != MILK_SHAKE_CHOICE)

साथ

if(typeChoice != FRUIT_SHAKE_CHOICE && typeChoice != MILK_SHAKE_CHOICE)
                                   ^^^^

अन्यथा अगर कभी सत्य नहीं होता - ऊपर दिए गए विकल्पों के आधार पर, आप यही करना चाहते हैं।

फिर सुनिश्चित करें कि इस मामले में "अधिक कोड" निष्पादित नहीं किया गया है

if(typeChoice != FRUIT_SHAKE_CHOICE && typeChoice != MILK_SHAKE_CHOICE) {
   printf("Wrong type\n");
   stop = 1;
}
else {
    // more stuff
}

आपके वर्तमान कोड में, भले ही stop 1 पर सेट हो, आप "अधिक सामान" करते हैं।

आप इसके विपरीत परीक्षण भी कर सकते हैं, और ठीक कोड में continue जोड़ सकते हैं, अन्यथा stop सेट कर सकते हैं

if(typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
    // do more stuff
    continue; // keep going
}
printf("Wrong choice, same player shoot again\n");
stop = 1;
2
Breaking not so bad 1 पद 2017, 18:40