आप कई अलग-अलग चीजों का मिश्रण कर रहे हैं: बयानों, ऑपरेटरों और बूलियन प्रकारों को नियंत्रित करें। प्रत्येक के अपने नियम हैं।
नियंत्रण कथन, उदाहरण के लिए ifकथन C11 6.4.8.1 की तरह काम करते हैं :
दोनों रूपों में, पहले सबस्टेशन को निष्पादित किया जाता है यदि अभिव्यक्ति असमान की तुलना 0 से करती है।
while, forआदि का एक ही नियम है। इसका "सत्य" या "असत्य" से कोई लेना-देना नहीं है।
माना जाता है कि ऑपरेटरों के लिए एक बूलियन परिणाम उपज रहे हैं, वे वास्तव में intमूल्य 1 या 0. के साथ उपज कर रहे हैं । उदाहरण के लिए समानता ऑपरेटरों, C11 6.5.9:
प्रत्येक ऑपरेटर 1 पैदावार देता है यदि निर्दिष्ट संबंध सही है और 0 झूठे होने पर
उपरोक्त सभी इसलिए है क्योंकि वर्ष 1999 तक C का बूलियन प्रकार नहीं था, और जब यह एक हो गया, तब भी उपरोक्त नियमों को नहीं बदला गया था। इसलिए अधिकांश अन्य प्रोग्रामिंग भाषाओं के विपरीत, जहां स्टेटमेंट और ऑपरेटर्स एक बूलियन प्रकार (जैसे सी ++ और जावा) का उत्पादन करते हैं, वे सिर्फ intएक मूल्य शून्य या शून्य नहीं के साथ उपज देते हैं । उदाहरण के लिए, sizeof(1==1)C में 4 देंगे लेकिन C ++ में 1।
सी में वास्तविक बूलियन प्रकार का नाम दिया गया है _Boolऔर एक आधुनिक संकलक की आवश्यकता है। हैडर stdbool.hपरिभाषित करता है मैक्रो bool, trueऔर false, कि का विस्तार _Bool, 1और 0(के साथ सी ++ संगतता के लिए) क्रमशः।
हालांकि इसे नियंत्रण कथनों और ऑपरेटरों के इलाज के लिए अच्छी प्रोग्रामिंग प्रैक्टिस माना जाता है, क्योंकि उन्हें वास्तव में बूलियन प्रकार की आवश्यकता होती है। MISRA-C जैसे कुछ कोडिंग मानक इस तरह के अभ्यास की सलाह देते हैं। अर्थात्:
if(ptr == NULL)के बजाय if(ptr)।
if((data & mask) != 0)के बजाय if(data & mask)।
इस तरह की शैली का उद्देश्य स्थिर विश्लेषण उपकरणों की सहायता से प्रकार की सुरक्षा को बढ़ाना है, जो बदले में बग को कम करता है। यकीनन, यह शैली तभी सार्थक है जब आप स्थैतिक विश्लेषणकर्ताओं का उपयोग करते हैं। हालांकि कुछ मामलों में यह अधिक पठनीय, स्व-दस्तावेजीकरण कोड की ओर जाता है, उदाहरण के लिए
if(c == '\0')
अच्छा है, आशय स्पष्ट है, कोड स्व-दस्तावेजीकरण है।
बनाम
if(c)
खराब। कुछ भी मतलब हो सकता है, और हमें cकोड को समझने के प्रकार की तलाश में जाना होगा । यह एक पूर्णांक, एक सूचक या एक चरित्र है?