क्या मैं किसी भी C ++ कंपाइलर के लिए सही (=) (int) 1 मान सकता हूं?


118

क्या मैं (bool)true == (int)1किसी C ++ कंपाइलर के लिए मान सकता हूं ?


3
आपके प्रश्न में जो जातियां हैं, वे निरर्थक हैं, क्या उन्हें उलट दिया जाना चाहिए?
GMANNICKG

9
उनका मतलब यह नहीं है कि वे bool t = true; int n = 1; if (t == n) {...} ;
जातियां हैं

7
@egrunin: एह, लेकिन सच एक बूल है और 1 वैसे भी एक इंट है। :)
GManNickG

1
सही, मेरा मतलब मूल्यों के प्रकार को बताना है।
पेट्रूजा

2
(int) trueहै 1एक पूर्णांक मान के रूप में है, लेकिन कुछ के रूप में if (pointer)तो हिस्सा है, तो के माध्यम से चला जाता है pointer != 0। केवल एक चीज जिसे आप सच मान सकते हैं false == 0, वह है , true != 0(और जब कास्ट करने के trueलिए मूल्यांकन करता 1है int)
लुइस कोलोराडो

जवाबों:


134

हाँ। जातियां बेमानी हैं। आपकी अभिव्यक्ति में:

true == 1

इंटीग्रल प्रमोशन लागू होता है और बूल वैल्यू को बढ़ावा दिया जाएगा intऔर इस प्रमोशन को 1 प्राप्त करना होगा।

संदर्भ: ४..in [conv.integral] / ४: यदि स्रोत प्रकार है bool... trueएक में परिवर्तित हो जाता है।


9
@ जोशुआ: trueभाषा द्वारा परिभाषित एक कीवर्ड है। इसे पुस्तकालय द्वारा पुनर्परिभाषित नहीं किया जा सकता है। #defineकीवर्ड को फिर से परिभाषित करने की अनुमति नहीं है।
जलेफ

21
@jalf: # परिभाषित वास्तव में सिस्टम कीवर्ड को परिभाषित करने की अनुमति है। सी संकलन का पूर्व-प्रसंस्करण चरण विशुद्ध रूप से पाठ्य है, और सामान्य रूप से कीवर्ड या सी सिंटैक्स के बारे में कुछ भी नहीं जानता है। फिर भी, यह निश्चित रूप से, भाषा के खोजशब्दों को फिर से परिभाषित करने के लिए लगभग हमेशा एक बुरा विचार है।
डेल हाग्लगंड

2
@jalf। वे नहीं हैं? Gcc.gnu.org/oniltocs/cpp/Macros.html , और अंतर्राष्ट्रीय Obfuscated C कोड प्रतियोगिता में प्रविष्टियों में से कम से कम एक को देखें , जिसने एक बार पूछा था "जब whileथोड़ी देर नहीं लगती है ?" (उत्तर: जब यह दो मापदंडों को लेता है, क्योंकि तब उस प्रविष्टि में #definedयह था printf।)
केन ब्लूम

3
C99, The6.10.1 / 1 कहता है: "सशर्त समावेशन को नियंत्रित करने वाली अभिव्यक्ति को छोड़कर एक पूर्णांक स्थिर अभिव्यक्ति होगी: इसमें एक कलाकार नहीं होगा; पहचानकर्ता (उन शब्दों के समान शाब्दिक रूप से समरूप सहित) की व्याख्या नीचे दी गई है;" हालांकि प्रत्यक्ष अनुमति के रूप में नहीं कहा गया है, यह स्पष्ट रूप से एक मैक्रो की संभावना पर विचार करता है जो एक कीवर्ड के लिए "लेक्सिकली समान" है।
जेरी कॉफिन

2
ओह, और #defines को खोजशब्दों को फिर से परिभाषित करने की अनुमति है। C ++ 1x ने अपने नए कीवर्ड के साथ बहुत अधिक समस्याएं पैदा कीं, ताकि आवश्यकता को दूर करना पड़े।
जोशुआ

18

चार्ल्स बेली का जवाब सही है। C ++ मानक से सटीक शब्दांकन (/4.7 / 4) है: "यदि स्रोत प्रकार बूल है, तो मान झूठा शून्य में परिवर्तित हो जाता है और मान सत्य में परिवर्तित हो जाता है।"

संपादित करें: मैं देख रहा हूं कि उसने संदर्भ जोड़ दिया है - मैं इसे शीघ्र ही हटा दूंगा, अगर मैं विचलित नहीं होता और भूल जाता हूं ...

Edit2: फिर से, यह संभवतः ध्यान देने योग्य है कि जबकि बूलियन मान हमेशा शून्य या एक में परिवर्तित होते हैं, कई फ़ंक्शन (विशेष रूप से सी मानक पुस्तकालय से) रिटर्न मान "मूल रूप से बूलियन" होते हैं, लेकिन intएस के रूप में प्रतिनिधित्व किया जाता है। आम तौर पर केवल शून्य को शून्य या गैर-शून्य को इंगित करने के लिए सही होना आवश्यक है। उदाहरण के लिए, यह * कार्य <ctype.h>केवल शून्य या गैर-शून्य की आवश्यकता है, जरूरी नहीं कि शून्य या एक हो।

यदि आप ऐसा करते हैं bool, तो शून्य गलत और गैर-शून्य को सही में बदल देगा (जैसा कि आप अपेक्षा करेंगे)।


9

मानक के अनुसार, आपको उस धारणा के साथ सुरक्षित होना चाहिए। C ++ boolप्रकार के दो मान हैं - trueऔर falseसंबंधित मान 1 और 0।

देखने के लिए चीज़ boolअभिव्यक्ति और चर के साथ BOOLअभिव्यक्ति और चर का मिश्रण है । उत्तरार्द्ध को परिभाषित किया गया है FALSE = 0और TRUE != FALSE, जो व्यवहार में अक्सर होता है, जिसका अर्थ है कि 0 से भिन्न किसी भी मूल्य को माना जाता है TRUE

बहुत सारे आधुनिक संकलक वास्तव में किसी भी कोड के लिए एक चेतावनी जारी करेंगे जो कि अनुमानित रूप से कास्ट करने की कोशिश करता BOOLहै boolयदि BOOLमान 0 या 1 से भिन्न है।


3

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


3
यह C ++ के लिए एक गलत उत्तर है, जैसा trueकि परिभाषित व्यवहार के साथ एक भाषा कीवर्ड है। यदि आप सामान्य रूप से परिभाषित मैक्रो को संदर्भित करते हैं जैसे कि TRUE, यह सही है।
डेविड थॉर्नले

1
हो सकता है कि मेरा अनुभव सी संकलकों के साथ था - मैंने वर्षों में उनके साथ बहुत समय बिताया है। बयानों में हालांकि सीधे गणितीय अभिव्यक्ति का उपयोग करने के बारे में मेरी बात। हमारे पास यह कोड था कि अगर एक बिट शिफ्ट एक में शून्य नहीं था, तो किसी और ने उसी गैर-शून्य मान को लिया और मान लिया कि यह 1 था और सामान उड़ा दिया। सत्य / 1 के लिए एक सरल रूपांतरण ने इसे रोका होगा।
माइकल डोरगन

मैंने भी इस तरह का व्यवहार देखा है। बेशक, मैंने आखिरी बार देखा था कि यह 1999 के बारे में था। मैं जीसीसी का उपयोग कर रहा था। भाषा सी। स्टिल थी, मैंने वास्तव में ऐसा व्यवहार देखा है।
thb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.