C Language
चयन विवरण
खोज…
यदि () कथन
कार्यक्रम के प्रवाह को नियंत्रित करने के सबसे सरल तरीकों में से एक है 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;
}