खोज…


टिप्पणियों

पूर्वनिर्धारित प्रकार _Bool और शीर्ष लेख <stdbool.h> का उपयोग करने के लिए, आपको <stdbool.h> के C99 / C11 संस्करणों का उपयोग करना चाहिए।

कंपाइलर चेतावनियों और संभवत: त्रुटियों से बचने के लिए, आपको केवल typedef / define उदाहरण का उपयोग करना चाहिए यदि आप भाषा के C89 और पिछले संस्करणों का उपयोग कर रहे हैं।

Stdbool.h का उपयोग करना

C99

सिस्टम हेडर फ़ाइल stdbool.h का उपयोग करने से आप बूलियन डेटा प्रकार के रूप में bool का उपयोग कर सकते हैं। true 1 मूल्यांकन करता है और false 0 मूल्यांकन करता है।

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    bool x = true;  /* equivalent to bool x = 1; */
    bool y = false; /* equivalent to bool y = 0; */
    if (x)  /* Functionally equivalent to if (x != 0) or if (x != false) */
    {
        puts("This will print!");
    }
    if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
    {
        puts("This will also print!");
    }
}

bool डेटा प्रकार _Bool लिए सिर्फ एक अच्छी वर्तनी है। इसके विशेष नियम होते हैं जब संख्या या संकेत इसे में परिवर्तित होते हैं।

#Define का उपयोग करना

सी सभी संस्करणों की, प्रभावी रूप से किसी भी पूर्णांक मान के अलावा अन्य का इलाज होगा 0 के रूप में true तुलना ऑपरेटरों के लिए और पूर्णांक मान 0 के रूप में false । यदि आपके पास C99 के रूप में _Bool या bool नहीं है, तो आप #define मैक्रोज़ का उपयोग करके C में बूलियन डेटा प्रकार का अनुकरण कर सकते हैं, और आपको अभी भी विरासत कोड में ऐसी चीज़ें मिल सकती हैं।

#include <stdio.h>

#define bool int
#define true 1
#define false 0

int main(void) {
    bool x = true;  /* Equivalent to int x = 1; */
    bool y = false; /* Equivalent to int y = 0; */
    if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
    {
        puts("This will print!");
    }
    if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
    {
        puts("This will also print!");
    }
}

इन मैक्रोज़ की परिभाषा <stdbool.h> आधुनिक उपयोगों के साथ टकराव हो सकता है क्योंकि यह नए कोड में परिचय नहीं है।

आंतरिक (बिल्ट-इन) प्रकार _Bool का उपयोग करना

C99

C मानक संस्करण C99 में जोड़ा गया, _Bool भी एक देशी C डेटा प्रकार है। यह मान 0 ( असत्य के लिए ) और 1 ( सत्य के लिए) धारण करने में सक्षम है।

#include <stdio.h>

int main(void) {
    _Bool x = 1; 
    _Bool y = 0;
    if(x) /* Equivalent to if (x == 1) */
    {
        puts("This will print!");
    }
    if (!y) /* Equivalent to if (y == 0) */
    {
        puts("This will also print!");
    }
}

_Bool एक पूर्णांक प्रकार है, लेकिन अन्य प्रकारों से रूपांतरण के लिए विशेष नियम हैं। परिणाम if अभिव्यक्ति में अन्य प्रकार के उपयोग के अनुरूप है। निम्नलिखित में

_Bool z = X;
  • यदि X अंकगणितीय प्रकार है (संख्या के किसी भी प्रकार है), z हो जाता है 0 अगर X == 0 । नहीं तो z 1 हो जाता है।
  • यदि X में एक पॉइंटर टाइप है, तो z 0 हो जाता है यदि X एक अशक्त पॉइंटर है और 1 अन्यथा।

<stdbool.h> स्पेलिंग bool , false और true का उपयोग करने के लिए आपको <stdbool.h> का उपयोग करना होगा।

बूलियन अभिव्यक्ति में पूर्णांक और संकेत।

सभी पूर्णांकों या बिंदुओं का उपयोग एक अभिव्यक्ति में किया जा सकता है जिसे "सत्य मूल्य" के रूप में व्याख्या की जाती है।

int main(int argc, char* argv[]) {
  if (argc % 4) {
    puts("arguments number is not divisible by 4");
  } else {
    puts("argument number is divisible by 4");
  }
...

व्यंजक argc % 4 का मूल्यांकन किया जाता है और 0 , 1 , 2 या 3 से किसी एक मान की ओर जाता है। पहला, 0 एकमात्र मान है जो "गलत" है और else भाग में निष्पादन लाता है। अन्य सभी मूल्य "सत्य" हैं और if भाग में जाते हैं।

double* A = malloc(n*sizeof *A);
if (!A) {
   perror("allocation problems");
   exit(EXIT_FAILURE);
}

यहां पॉइंटर A का मूल्यांकन किया जाता है और यदि यह एक शून्य पॉइंटर है, तो एक त्रुटि का पता लगाया जाता है और प्रोग्राम बाहर निकल जाता है।

बहुत से लोग इसके बजाय A == NULL रूप में कुछ लिखना पसंद करते हैं, लेकिन अगर आपके पास अन्य जटिल अभिव्यक्तियों के हिस्से के रूप में ऐसे सूचक तुलना हैं, तो चीजें पढ़ना मुश्किल हो जाता है।

char const* s = ....;   /* some pointer that we receive */
if (s != NULL && s[0] != '\0' && isalpha(s[0])) {
   printf("this starts well, %c is alphabetic\n", s[0]);
}

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

char const* s = ....;   /* some pointer that we receive */
if (s && s[0] && isalpha(s[0])) {
   printf("this starts well, %c is alphabetic\n", s[0]);
}

कब्जा करना अपेक्षाकृत आसान है: यदि सूचक वैध है तो हम जांचते हैं कि क्या पहला चरित्र गैर-शून्य है और फिर यह जांचें कि क्या यह एक पत्र है।

टाइपडिफ का उपयोग करके एक बूल प्रकार को परिभाषित करना

यह देखते हुए कि अधिकांश डीबगर #define मैक्रोज़ के बारे में नहीं जानते हैं, लेकिन enum स्थिरांक की जांच कर सकते हैं, ऐसा कुछ करना वांछनीय हो सकता है:

#if __STDC_VERSION__ < 199900L
typedef enum { false, true } bool;
/* Modern C code might expect these to be macros. */
# ifndef bool
#  define bool bool
# endif
# ifndef true
#  define true true
# endif
# ifndef false
#  define false false
# endif
#else
# include <stdbool.h>
#endif

/* Somewhere later in the code ... */
bool b = true;

यह C के ऐतिहासिक संस्करणों के कार्य करने के लिए संकलक को अनुमति देता है, लेकिन यदि कोड आधुनिक C संकलक के साथ संकलित किया जाता है तो यह संगत रहता है।

अधिक जानकारी के लिए typedef , देख typedef , के लिए के बारे में अधिक enum देख Enumerations



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