जब मैं उदाहरण के लिए सी में 7>1
लिखता हूं (सी 99 कहें तो यह हमेशा एक सुविधा नहीं है), क्या मैं उम्मीद कर सकता हूं कि परिणाम बिल्कुल 1 या सिर्फ कुछ गैर-शून्य मान होगा? क्या यह सभी बूल ऑपरेटरों के लिए है?"सत्य" परिणाम है, <,!, &&, || या == परिभाषित?
उत्तर
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
के रूप में संभव मूल्यों के साथ। (जब तक मुझे कुछ याद नहीं आया।)
और आसानी से stdbool.h सत्य और गलत को 1 और 0 के रूप में परिभाषित करता है (सी 99 7.16) – Lundin
अच्छा, खासकर जब से && और || अन्य भाषाओं में अलग-अलग व्यवहार करते हैं (अंतिम मूल्यांकन मूल्य लौटाते हैं)। यदि मानक ऑपरेटर शामिल नहीं हैं, तो क्लैंपिंग '!!' या [कास्टिंग 'का उपयोग कर किया जा सकता है '
सी अपने बुलियन ऑपरेटर के लिए Postel's Law का पालन करता है: आप जो करते हैं उसमें रूढ़िवादी रहें, जो आप दूसरों से स्वीकार करते हैं उसमें उदार रहें। यह किसी भी शून्य-शून्य मान को बूलियन अभिव्यक्तियों में सत्य के रूप में मानता है, लेकिन यह हमेशा 0 या 1 स्वयं उत्पन्न करेगा। 2 != 3
हमेशा 1
है।
+1 – glglgl
आईएसओ C99 मानक से, खंड 6.5.8:
6 ऑपरेटरों < (कम से कम) में से प्रत्येक> (से अधिक), < = (कम से कम या बराबर), और > = (इससे अधिक या बराबर) 1 उत्पन्न होगा यदि निर्दिष्ट संबंध सत्य है और 0 यदि यह गलत है। परिणाम प्रकार int है।
खंड 6.5.9 से:
3 == (के बराबर) और = (बराबर नहीं करने के लिए) ऑपरेटरों उनके कम पूर्वता के अलावा संबंधपरक ऑपरेटर के अनुरूप हैं। ऑपरेटर के प्रत्येक 1 उत्पन्न करते हैं यदि निर्दिष्ट संबंध सत्य है औरयह गलत है। परिणाम int int है। ऑपरेटरों की किसी भी जोड़ी के लिए, वास्तव में संबंधों में से एक सच है।
यही बात तार्किक संयोजन के रूप (&&
) और अलगाव (||
) ऑपरेटरों के साथ होता है।
पीएस: संयोग से, यही कारण है कि बिटवाई ऑपरेटरों (&
और |
) आमतौर पर तार्किक ऑपरेटरों के गैर-शॉर्ट-सर्किटिंग संस्करणों के रूप में उपयोग किया जा सकता है।
सभी सी ऑपरेटरों कि तार्किक सही/गलत मान उपज हमेशा सच के लिए झूठे के लिए मूल्य 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
तुलना कर सकते हैं, लेकिन वहाँ ऐसा करने का कोई अच्छा कारण है, कि क्या !
ऑपरेटर के लिए है।)
- 1. । एचटीएसीएसी परीक्षण यदि ENV सत्य है या परिभाषित
- 2. डेटा-रिमोट सत्य कॉलबैक को परिभाषित करना
- 3. स्वचालित माइग्रेशन गलत या सत्य सक्षम है?
- 4. जावास्क्रिप्ट बूलियन: झूठे और सही परिणाम सत्य में
- 5. प्रोलॉग या (;) नियम रिटर्न एकाधिक परिणाम
- 6. PHP सत्य और 'सत्य' अंतर
- 7. एसक्यूएल बूलियन सत्य परीक्षण: शून्य या शून्य
- 8. LINQ क्वेरी जहां बूलियन मान सत्य है या झूठा
- 9. # परिभाषित या कॉन्स स्ट्रिंग *
- 10. # परिभाषित या enum?
- 11. जेएसपीएक्स से <विकल्प चयनित = "सत्य"> आउटपुट कैसे करें?
- 12. isAvailableForServiceType हमेशा सत्य देता है?
- 13. कोडिनेटर बेसपैथ को परिभाषित करता है या
- 14. सत्य/झूठी
- 15. jQuery.extend (सत्य, ...)
- 16. सी # स्क्लाइट क्वेरी परिणाम <string>
- 17. SOAP दोष या परिणाम वस्तु?
- 18. SPSite.Exists() सत्य लौटाता है हालांकि साइट संग्रह मौजूद नहीं है
- 19. 'सत्य' चर प्राप्त करें
- 20. डेटा.table परिभाषित क्यों किया गया है: = ओवरलोडिंग के बजाय <-?
- 21. @ फोर्सडिस्क्रिमिनेटर/@ डिस्कमिमिनेटरऑप्शन (बल = सत्य)
- 22. "सत्य" ऑब्जेक्ट ओरिएंटेशन
- 23. <परिनियोजन खुदरा = "सत्य"> और डीबग = "झूठी" के बीच क्या अंतर है?
- 24. MySQL परिणाम PHP - arrays या ऑब्जेक्ट्स में परिणाम?
- 25. SecurityElement.IsValidText "&" पर सत्य लौटाता है ... क्यों?
- 26. <? या <? php --- क्या कोई अंतर है?
- 27. दोस्त == या << मुझे इसका उपयोग कब करना चाहिए?
- 28. निम्नलिखित कोड "सत्य, सत्य, झूठा, सच" प्रिंट करता है। यह "सत्य, सच, सच, सच" नहीं होना चाहिए?
- 29. ज़ेंड फॉर्म सेट आवश्यक (सत्य) या addValidator (NotEmpty)
- 30. जैक्सन पार्सर: अपरिचित टोकन 'tieheT': 'शून्य', 'सत्य' या 'झूठी'
यह सबसे अधिक संभावना एक नकली है, लेकिन मैं नहीं था इसे खोजने में सक्षम :-( – mbq
@TRD: गलत। सी अभिव्यक्ति '7> 1' मान' 1' के साथ 'int' प्रकार का परिणाम उत्पन्न करती है। –