खोज…


यदि () कथन

कार्यक्रम के प्रवाह को नियंत्रित करने के सबसे सरल तरीकों में से एक है if चयन कथनों का उपयोग करना। कोड का एक ब्लॉक निष्पादित किया जाना है या नहीं निष्पादित किया जाना है, इस कथन द्वारा निर्णय लिया जा सकता है।

if C में चयन स्टेटमेंट हो सकता है, if इसका सिंटैक्स इस प्रकार है:

if(cond) 
{
  statement(s);  /*to be executed, on condition being true*/
}

उदाहरण के लिए,

if (a > 1) {
    puts("a is larger than 1");
}

जहाँ a > 1 एक ऐसी स्थिति है, जिसे if ब्लॉक के अंदर कथनों को निष्पादित करने के लिए true मूल्यांकन करना true । इस उदाहरण में "a a 1 से बड़ा है" केवल तभी मुद्रित होता है यदि a > 1 सत्य है।

if चयन स्टेटमेंट रैपिंग ब्रेसेस को छोड़ सकते हैं { और } यदि ब्लॉक के भीतर केवल एक स्टेटमेंट है। उपरोक्त उदाहरण को फिर से लिखा जा सकता है

if (a > 1)
    puts("a is larger than 1");

हालाँकि ब्लॉक के भीतर कई कथनों को निष्पादित करने के लिए ब्रेसिज़ का उपयोग करना होता है।

if लिए शर्त कई भावों को शामिल कर सकती है। if केवल अभिव्यक्ति के अंतिम परिणाम सच है, तो कार्रवाई करेंगे।

उदाहरण के लिए

if ((a > 1) && (b > 1)) {
    puts("a is larger than 1");
    a++;
}

केवल printf और a++ निष्पादित करेगा यदि a और b दोनों 1 से अधिक हैं।

if () ... और कथन और वाक्य रचना

हालांकि if कोई कार्रवाई केवल तब होती है जब उसकी स्थिति true मूल्यांकन करती true , if / else आपको विभिन्न क्रियाओं को निर्दिष्ट करने की अनुमति देता है जब शर्त true और जब स्थिति false

उदाहरण:

if (a > 1)
    puts("a is larger than 1");
else 
    puts("a is not larger than 1");

वैसे ही जैसे if बयान, जब भीतर ब्लॉक if या else केवल एक ही बयान से मिलकर है, तो ब्रेसिज़ छोड़ा जा सकता है (लेकिन इतना अनुशंसित नहीं है ऐसा करने के रूप में यह आसानी से अनायास समस्याओं लागू कर सकते हैं)। लेकिन वहाँ के भीतर एक से अधिक बयान है कि अगर if या else ब्लॉक, तो ब्रेसिज़ कि विशेष रूप से खंड पर इस्तेमाल किया जा रहा है।

if (a > 1) 
{
    puts("a is larger than 1");
    a--;
}
else 
{
    puts("a is not larger than 1");
    a++;
}

स्विच () कथन

जब आप अपना प्रोग्राम किसी विशेष परीक्षण चर के मान के अनुसार करना चाहते हैं तो switch स्टेटमेंट उपयोगी होते हैं।

switch स्टेटमेंट का एक उदाहरण इस प्रकार है:

int a = 1;

switch (a) {
case 1:
    puts("a is 1");
    break;
case 2:
    puts("a is 2");
    break;
default:
    puts("a is neither 1 nor 2");
    break;
}

यह उदाहरण इसके बराबर है

int a = 1;

if (a == 1) {
    puts("a is 1");
} else if (a == 2) {
    puts("a is 2");
} else {
    puts("a is neither 1 nor 2");
}

यदि का मान a 1 जब है switch बयान प्रयोग किया जाता है, a is 1 प्रिंट किया जाएगा। यदि का मान a 2 तो है, a is 2 प्रिंट किया जाएगा। अन्यथा, a is neither 1 nor 2 मुद्रित किया जाएगा।

case n: यह वर्णन करने के लिए उपयोग किया जाता है कि निष्पादन स्टेटमेंट switch करने के लिए पारित मूल्य में n कहां होगा। n को संकलित-समय स्थिर होना चाहिए और एक ही n एक switch स्टेटमेंट में सबसे अधिक बार मौजूद हो सकता है।

default: का उपयोग यह बताने के लिए किया जाता है कि जब मान case n: लिए किसी भी विकल्प से मेल नहीं खाता था:। अप्रत्याशित व्यवहार को पकड़ने के लिए हर स्विच स्टेटमेंट में एक default मामले को शामिल करना एक अच्छा अभ्यास है।

एक break; स्टेटमेंट को switch ब्लॉक से बाहर कूदना आवश्यक है।

नोट: यदि आप किसी case के अंत के बाद गलती से एक break जोड़ना भूल जाते हैं, तो कंपाइलर मान लेगा कि आपका इरादा "गिरना" है और उसके बाद के सभी स्टेटमेंट, यदि कोई हो, (जब तक कि ब्रेक स्टेटमेंट नहीं मिल जाता है) इसके बाद के मामलों में से कोई भी, चाहे बाद के केस स्टेटमेंट मेल खाते हों या नहीं। यह विशेष गुण डफ के उपकरण को लागू करने के लिए उपयोग किया जाता है। इस व्यवहार को अक्सर सी भाषा विनिर्देश में एक दोष माना जाता है।

नीचे एक उदाहरण है जो break; की अनुपस्थिति के प्रभावों को दर्शाता है break; :

int a = 1;

switch (a) {
case 1:
case 2:
    puts("a is 1 or 2");
case 3:
    puts("a is 1, 2 or 3");
    break;
default:
    puts("a is neither 1, 2 nor 3");
    break;
}

जब का मूल्य a 1 या 2 है, a is 1 or 2 और a is 1, 2 or 3 दोनों प्रिंट किया जाएगा। जब a 3 होता है, तो केवल a is 1, 2 or 3 मुद्रित किया जाएगा। अन्यथा, a is neither 1, 2 nor 3 मुद्रित किया जाएगा।

ध्यान दें कि default मामला आवश्यक नहीं है, खासकर जब switch में आपके द्वारा प्राप्त मूल्यों का सेट समाप्त हो जाता है और संकलन समय पर जाना जाता है।

सबसे अच्छा उदाहरण एक enum पर एक switch का उपयोग कर रहा है।

enum msg_type { ACK, PING, ERROR };
void f(enum msg_type t)
{
  switch (t) {
  case ACK:
    // do nothing
    break;
  case PING:
    // do something
    break;
  case ERROR:
    // do something else
    break;
  }
}

ऐसा करने के कई फायदे हैं:

  • यदि आप मान नहीं संभालते हैं तो अधिकांश संकलक एक चेतावनी की सूचना देंगे (यदि कोई default मामला मौजूद था तो इसकी सूचना नहीं दी जाएगी)
  • इसी कारण से, यदि आप enum लिए एक नया मान जोड़ते हैं, तो आपको उन सभी स्थानों के बारे में सूचित किया जाएगा जहाँ आप नए मान को संभालना भूल गए ( default मामले के साथ, आपको ऐसे मामलों की खोज करने के लिए मैन्युअल रूप से अपना कोड तलाशने की आवश्यकता होगी)
  • पाठक को यह पता लगाने की आवश्यकता नहीं है कि " default: क्या छिपा हुआ है default: ", चाहे अन्य enum मान हो या क्या यह "सिर्फ मामले में" के लिए सुरक्षा है। और अगर अन्य enum मान हैं, तो क्या कोडर ने जानबूझकर उनके लिए default मामले का उपयोग किया है या क्या कोई बग है जो मूल्य जोड़ा जाने पर पेश किया गया था?
  • प्रत्येक enum मान को संभालने से कोड स्व व्याख्यात्मक हो जाता है क्योंकि आप एक वाइल्ड कार्ड के पीछे नहीं छिप सकते, आपको उनमें से प्रत्येक को स्पष्ट रूप से संभालना होगा।

फिर भी, आप किसी को बुराई कोड लिखने के लिए नहीं रोक सकते जैसे:

enum msg_type t = (enum msg_type)666; // I'm evil

इस प्रकार, यदि आप वास्तव में इसकी आवश्यकता है, तो इसका पता लगाने के लिए अपने स्विच से पहले एक अतिरिक्त जांच जोड़ सकते हैं।

void f(enum msg_type t)
{
   if (!is_msg_type_valid(t)) {
      // Handle this unlikely error
   }

   switch(t) { 
    // Same code than before
   }
}

if () ... और सीढ़ी दो या अधिक का पीछा करते हुए यदि () ... और कथन

जबकि if ()... else कथन केवल एक (डिफ़ॉल्ट) व्यवहार को परिभाषित करने की अनुमति देता है, जो तब होता है जब if () में शर्त पूरी नहीं होती है, if () ... else दो या अधिक का पीछा करते हुए if () ... else कथन एक जोड़े को परिभाषित करने की अनुमति देते हैं पिछले पर जाने से पहले अधिक व्यवहार else , एक "डिफ़ॉल्ट" के रूप में शाखा अभिनय यदि कोई हो।

उदाहरण:

int a = ... /* initialise to some value. */

if (a >= 1) 
{
    printf("a is greater than or equals 1.\n");
} 
else if (a == 0) //we already know that a is smaller than 1
{
    printf("a equals 0.\n");
}
else /* a is smaller than 1 and not equals 0, hence: */
{ 
    printf("a is negative.\n");
}

नेस्टेड अगर () ... वरना वीएस इफ़ () .. और सीढ़ी

नेस्ट if()...else बयानों अधिक निष्पादन समय (वे धीमे हैं) एक करने के लिए ले तुलना में if()...else वजह से नेस्ट सीढ़ी if()...else बयान बाहरी एक बार सभी आंतरिक सशर्त बयान की जांच सशर्त if() कथन संतुष्ट है, जबकि if()..else सीढ़ी किसी भी if() या if() else if() सशर्त बयान सही हैं, if() एक बार शर्त परीक्षण बंद हो जाएगा।

एक if()...else सीढ़ी:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if ((a < b) && (a < c))
  {
    printf("\na = %d is the smallest.", a);
  }
  else if ((b < a) && (b < c))
  {
    printf("\nb = %d is the smallest.", b);
  }
  else if ((c < a) && (c < b))
  {
    printf("\nc = %d is the smallest.", c);
  }
  else
  {
    printf("\nImprove your coding logic");
  }
  return 0;
}

सामान्य मामले में, समतुल्य नेस्टेड से बेहतर माना जाता है if()...else :

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if (a < b)
  {
    if (a < c)
      {
        printf("\na = %d is the smallest.", a);
      }
    else
      {
        printf("\nc = %d is the smallest.", c);
      }
  }
  else
  {
    if(b < c)
    {
      printf("\nb = %d is the smallest.", b);
    }
    else
    {
      printf("\nc = %d is the smallest.", c);
    }
  }
  return 0;  
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow