सी और कुछ समान भाषाओं में, समानता के लिए बूलियन अभिव्यक्तियों की तुलना करना falseया trueएक खतरनाक आदत है।
सी में किसी भी स्केलर एक्सप्रेशन (न्यूमेरिक या पॉइंटर) का उपयोग बूलियन संदर्भ में किया जा सकता है, उदाहरण के लिए ifस्टेटमेंट की स्थिति के रूप में । सी नियम यह है कि if (cond)बराबर है if (cond != 0)- अर्थात, शून्य गलत है, और कोई भी गैर-शून्य मान सत्य है। यदि condपॉइंटर प्रकार का है, 0एक अशक्त पॉइंटर स्थिरांक के रूप में माना जाता है; if (ptr)का मतलब है if (ptr != NULL)।
इस का मतलब है कि
if (cond)
तथा
if (cond == true)
एक ही बात का मतलब नहीं है । condगैर-शून्य होने पर पहला सच है; दूसरा तभी सही है जब वह बराबर हो true, जो C में (यदि आपके पास है #include <stdbool.h>) बस है 1।
उदाहरण के लिए, isdigit()फ़ंक्शन <ctype.h>रिटर्न में एक intमूल्य घोषित करता है , 0यदि तर्क एक अंक है, तो गैर-शून्य यदि यह नहीं है। यह 42इंगित करने के लिए वापस आ सकता है कि स्थिति सच है। तुलना 42 == trueकरना विफल हो जाएगा।
ऐसा होता है कि 0एक ही मूल्य को गलत माना जाता है, इसलिए समानता के लिए तुलना falseकरना काम करेगा; if (!cond)और if (cond == false)वही काम करो। लेकिन अगर आप इसका फायदा उठाने जा रहे हैं, तो आपको याद रखना होगा कि तुलना करना falseठीक है, और तुलना करना ठीक trueनहीं है। अभी तक की तुलना में, सबसे अधिक समयtrue काम करेगा (उदाहरण के लिए, समानता और संबंधपरक ऑपरेटर हमेशा या तो उपज देते हैं )। इसका मतलब यह है कि आपके द्वारा उपयोग किए जाने वाले किसी भी कीड़े को अभी भी नीचे ट्रैक करना मुश्किल हो सकता है। (चिंता न करें, जैसे ही आप किसी महत्वपूर्ण ग्राहक को कोड प्रदर्शित करेंगे, वे दिखाई देंगे।)01
सी ++ में थोड़ा अलग नियम हैं; उदाहरण के लिए, इसका boolप्रकार भाषा में थोड़ा अधिक कसकर एकीकृत है, और टाइप करने के लिए if (cond)कनवर्ट करता condहै bool। लेकिन प्रभाव (ज्यादातर) एक ही है।
कुछ अन्य भाषाओं एक क्या बेहतर व्यवहार किया बूलियन्स, ऐसी है कि कॉल कर सकते है cond == trueऔर cond == false(या जो भी वाक्य रचना होने के लिए होता है) सुरक्षित है। फिर भी, मैंने जो भी भाषा देखी है उसमें एक notया एक !ऑपरेटर है; यह वहां है, इसलिए आप इसका उपयोग कर सकते हैं। का उपयोग cond == falseकरने के बजाय !condया not condनहीं, मेरी राय में, पठनीयता में सुधार करता है। (यह सच है कि !चरित्र को एक नज़र में देखना मुश्किल हो सकता है; मैं इससे !बचने के लिए कभी-कभी एक स्थान जोड़ देता हूं ।)
और अक्सर आप इस मुद्दे से बच सकते हैं और कोड को फिर से व्यवस्थित करके स्पष्टता में सुधार कर सकते हैं। उदाहरण के लिए, इसके बजाय:
if (!cond) {
do_this();
}
else {
do_that();
}
आप लिख सकते हैं:
if (cond) {
do_that();
}
else {
do_this();
}
यह हमेशा बेहतर नहीं होता है, लेकिन यह उन अवसरों की तलाश में चोट नहीं करता है जहां यह है।
सारांश: सी और सी ++ में, समानता की तुलना trueऔर falseखतरनाक, अत्यधिक क्रिया और खराब शैली से की जाती है। कई अन्य भाषाओं में, इस तरह की तुलना खतरनाक नहीं हो सकती है, लेकिन वे अभी भी बहुत खराब और खराब शैली के हैं।