2011-10-07 14 views
19

जब मैं उदाहरण के लिए सी में 7>1 लिखता हूं (सी 99 कहें तो यह हमेशा एक सुविधा नहीं है), क्या मैं उम्मीद कर सकता हूं कि परिणाम बिल्कुल 1 या सिर्फ कुछ गैर-शून्य मान होगा? क्या यह सभी बूल ऑपरेटरों के लिए है?"सत्य" परिणाम है, <,!, &&, || या == परिभाषित?

+3

यह सबसे अधिक संभावना एक नकली है, लेकिन मैं नहीं था इसे खोजने में सक्षम :-( – mbq

+3

@TRD: गलत। सी अभिव्यक्ति '7> 1' मान' 1' के साथ 'int' प्रकार का परिणाम उत्पन्न करती है। –

उत्तर

35

C99 §6.5.8 संबंधपरक ऑपरेटर के अंतर्गत वह आइटम 6 (<, >, <= और >=):

ऑपरेटरों < (कम से कम),> (से अधिक) में से प्रत्येक < = (कम से कम या बराबर), और> = (इससे बड़ा या बराबर) उपज जाएगा, यदि निर्दिष्ट संबंध सच है और अगर यह गलत है) परिणाम टाइप पूर्णांक है। !

== (के बराबर) और = (बराबर नहीं करने के लिए) ऑपरेटरों अनुरूप हैं:

समानता ऑपरेटरों के लिए के रूप में, यह §6.5.9 में आगे एक सा (== और !=) है ऑपरेटरों को उनकी निचली प्राथमिकता को छोड़कर) ऑपरेटरों में से प्रत्येक उत्पन्न करता है यदि निर्दिष्ट संबंध सत्य है और यदि यह गलत है। परिणाम int टाइप किया गया है। ऑपरेटरों की किसी भी जोड़ी के लिए, वास्तव में संबंधों में से एक सत्य है।

तार्किक और और तार्किक या §6.5.13 (&&)

में अभी तक एक सा आगे हैं & & ऑपरेटर उपज जाएगा अगर इसकी ऑपरेंड के दोनों 0 से असमान तुलना; अन्यथा, यह उपज उत्पन्न करता है। परिणाम int टाइप किया गया है।

... और §6.5.14 (||)

|| ऑपरेटर उपज करेगा यदि उसके ऑपरेटरों में से कोई भी असमान 0 की तुलना करता है; अन्यथा, यह उपज उत्पन्न करता है। परिणाम int टाइप किया गया है।

और एकल अंकगणितीय ऑपरेटर ! के शब्दों §6.5.3.3/4 पर अधिक कर रहे हैं:

तार्किक निषेध ऑपरेटर का परिणाम! अगर इसके संकार्य के मूल्य असमान 0, तुलना अगर इसकी संकार्य के मूल्य के बराबर तुलना 0 पर परिणाम टाइप पूर्णांक है है। अभिव्यक्ति! ई बराबर है (0 == ई)।

परिणाम प्रकार बोर्ड भर में int है, 0 और 1 के रूप में संभव मूल्यों के साथ। (जब तक मुझे कुछ याद नहीं आया।)

+6

और आसानी से stdbool.h सत्य और गलत को 1 और 0 के रूप में परिभाषित करता है (सी 99 7.16) – Lundin

+0

अच्छा, खासकर जब से && और || अन्य भाषाओं में अलग-अलग व्यवहार करते हैं (अंतिम मूल्यांकन मूल्य लौटाते हैं)। यदि मानक ऑपरेटर शामिल नहीं हैं, तो क्लैंपिंग '!!' या [कास्टिंग 'का उपयोग कर किया जा सकता है ' ''बूल'] (http://www.jacquesf.com/2011/04/in-defense-of-the-c99-boolean-type/)। पोस्टेल के कानून का उल्लेख करने के लिए – Tobu

14

सी अपने बुलियन ऑपरेटर के लिए Postel's Law का पालन करता है: आप जो करते हैं उसमें रूढ़िवादी रहें, जो आप दूसरों से स्वीकार करते हैं उसमें उदार रहें। यह किसी भी शून्य-शून्य मान को बूलियन अभिव्यक्तियों में सत्य के रूप में मानता है, लेकिन यह हमेशा 0 या 1 स्वयं उत्पन्न करेगा। 2 != 3 हमेशा 1 है।

+0

+1 – glglgl

6

आईएसओ C99 मानक से, खंड 6.5.8:

6 ऑपरेटरों < (कम से कम) में से प्रत्येक> (से अधिक), < = (कम से कम या बराबर), और > = (इससे अधिक या बराबर) 1 उत्पन्न होगा यदि निर्दिष्ट संबंध सत्य है और 0 यदि यह गलत है। परिणाम प्रकार int है।

खंड 6.5.9 से:

3 == (के बराबर) और = (बराबर नहीं करने के लिए) ऑपरेटरों उनके कम पूर्वता के अलावा संबंधपरक ऑपरेटर के अनुरूप हैं। ऑपरेटर के प्रत्येक 1 उत्पन्न करते हैं यदि निर्दिष्ट संबंध सत्य है औरयह गलत है। परिणाम int int है। ऑपरेटरों की किसी भी जोड़ी के लिए, वास्तव में संबंधों में से एक सच है।

यही बात तार्किक संयोजन के रूप (&&) और अलगाव (||) ऑपरेटरों के साथ होता है।

पीएस: संयोग से, यही कारण है कि बिटवाई ऑपरेटरों (& और |) आमतौर पर तार्किक ऑपरेटरों के गैर-शॉर्ट-सर्किटिंग संस्करणों के रूप में उपयोग किया जा सकता है।

4

सभी सी ऑपरेटरों कि तार्किक सही/गलत मान उपज हमेशा सच के लिए झूठे के लिए मूल्य 0 साथ प्रकार int का एक परिणाम निकलेगा, 1

यह सभी C अभिव्यक्ति के लिए मामला नहीं है जो तार्किक रूप से सही/गलत मान उत्पन्न करता है। उदाहरण के लिए, is*() वर्ण वर्गीकरण कार्यों को <ctype.h> (isdigit(), isupper() इत्यादि) में घोषित किया गया है, यदि स्थिति गलत है, तो 0 लौटाएं, लेकिन यदि स्थिति सत्य है तो कोई गैर-शून्य मान वापस कर सकता है।

जब तक आप सीधे परिणाम का उपयोग के रूप में एक शर्त के रूप में:

if (isdigit(c) == 1) ... /* WRONG */ 
if (isdigit(c) == true) ... /* ALSO WRONG */ 

यह किसी भी समस्याओं का कारण नहीं होना चाहिए:

if (isdigit(c)) ... 
if (!isdigit(c)) ... 
if (isdigit(c) || islower(c)) ... 

और यह कुछ करने के लिए तुलना करने के लिए का प्रयास न करें ।

(आप सुरक्षित रूप से परिणाम 0 या false तुलना कर सकते हैं, लेकिन वहाँ ऐसा करने का कोई अच्छा कारण है, कि क्या ! ऑपरेटर के लिए है।)

संबंधित मुद्दे