2009-09-25 20 views
27

if (c) सी ++ में if (c == 0) के समान है?सी ++ में कथन का मूल्यांकन कैसे किया जाता है?

+2

ध्यान रखें कि 0 हमेशा एक ही चीज़ का मतलब नहीं है। यह शून्य सूचक स्थिर या पूर्णांक शून्य हो सकता है। –

+3

क्या आपका मतलब यह नहीं है "क्या अगर (सी) सी ++ में (सी! = 0) जैसा ही है?" ? –

+0

एक विशेष प्रकार के चर सी है? –

उत्तर

44

नहीं, if (c)if (c != 0) जैसा ही है। और if (!c)if (c == 0) जैसा ही है।

+9

मानना ​​कोई अजीब ओवरलोडिंग नहीं ले रहा है जगह, जो अक्सर सी ++ में जवाब का हिस्सा है। –

+6

संभोग, यदि ऑपरेटरों == या! = ओवरलोड हो गए हैं, कुछ भी हो सकता है, यह आपके लिए राष्ट्रीय गान भी खेलना शुरू कर सकता है ... ;-) – Jesper

+9

इन दिनों में से एक मैं एक वर्ग बनाने जा रहा हूं जो ऑपरेटरों को अधिभारित करता है ध्वनि प्रभाव खेलने के लिए। जब भी कोई उन्हें सॉर्ट करना चाहता है तो यह भयानक होगा। – rlbond

3

इसे और अधिक की तरह if (c != 0)

बेशक, != ऑपरेटर अतिभारित किया जा सकता है, तो यह कहना है कि उन लोगों के बिल्कुल बराबर हैं पूरी तरह से सही नहीं है।

0

हां वे == 0!= 0 में बदलते हैं, तो वे वही हैं।

+0

उह, नहीं वे नहीं हैं। – Aistina

+0

यदि कथन * परिभाषित * को शून्य के रूप में कुछ भी शून्य स्वीकार करने के लिए है। तो हाँ यह वही है। –

21

मैं इस पर पैक से तोड़ दूंगा ... "if (c)" "if (((bool)c) == true)" के सबसे नज़दीकी है। पूर्णांक प्रकारों के लिए, इसका अर्थ है "if (c != 0)"। जैसा कि अन्य ने इंगित किया है, operator != ओवरलोडिंग कुछ अजीबता का कारण बन सकती है, लेकिन जब तक मैं गलत नहीं हूं तब तक "operator bool()" ओवरलोड कर सकता है।

+1

प्रश्न मूल रूप से केवल सी के साथ टैग किया गया था, इसलिए ऊपर दिए गए उत्तरों के बाद से सी –

+3

में कोई बूल नहीं है यदि (static_cast (सी)) ... मुझे अपना कोट मिल जाएगा। –

+0

सी 99 में बूल है ... – rlbond

0

यह संख्यात्मक मानों के लिए केवल सत्य है।

#include <stdio.h> 

class c_type 
{ 
public: 
    operator bool() 
    { 
     return true; 
    } 
}; 

int main() 
{ 
    c_type c; 
    if (c) printf("true"); 
    if (!c) printf ("false"); 
} 
6

तो ग एक सूचक या एक अंकीय मान है,

if(c) 

के बराबर है: अगर ग वर्ग है, इस तरह के यहाँ में के रूप में एक ऑपरेटर अतिभारित जो रूपांतरण बूलियन करता है, होना चाहिए
if(c != 0) 

तो ग एक बूलियन (प्रकार bool [केवल सी ++]), (संपादित करें: या ऑपरेटर bool() के अधिभार के साथ एक उपयोगकर्ता-निर्धारित प्रकार) है

if(c) 

, तो ग और न ही एक सूचक या एक अंकीय मान न बूलियन नहीं है

if(c == true) 

के बराबर है

if(c) 

संकलन नहीं होंगे।

+2

यह सी उपयोगकर्ता द्वारा परिभाषित प्रकार है जिसे केवल 'ऑपरेटर बूल()' को डी। शॉली और गैलेट्स दोनों के रूप में लागू किया जा सकता है और इसलिए यह ठीक से संकलित होगा। – Troubadour

+0

सटीक, मैं इसे स्पष्टीकरण –

-5

तो c एक सूचक तो परीक्षण

if (c) 

है काफी एक ही रूप में

if (c != 0) 

उत्तरार्द्ध जबकि पूर्व 0 (शून्य) सूचक के खिलाफ c की एक सीधी जांच है नहीं है वास्तव में यह जांचने के लिए एक निर्देश है कि c मान्य वस्तु के लिए बिंदु है या नहीं। आम तौर पर कंपाइलर एक ही कोड का उत्पादन करते हैं।

+0

संख्या में जोड़ता हूं, यह नहीं है ... दोनों का अर्थ सूचक के मामले में बिल्कुल समान है: यदि (c! = NULL) – Massa

+0

संकलन और/या रनटाइम के लिए कोई तरीका नहीं है पता है कि कोई ऑब्जेक्ट सी या सी ++ में मान्य है या नहीं। आप लिख सकते हैं: "एक्स * सी = (एक्स *) 1;" फिर सी लगभग निश्चित रूप से किसी अमान्य वस्तु को इंगित करता है। और "अगर (सी)" सच होगा। –

+0

@Andrew: मुझे संदेह है कि आप अपने बयान को उचित ठहरा सकते हैं कि यह जांचने का कोई तरीका नहीं है कि ऑब्जेक्ट मान्य है या नहीं। निश्चित रूप से इसे चलाने के लिए रन-टाइम कोड उत्पन्न करने के लिए संकलक द्वारा बहुत सारे प्रयासों की आवश्यकता होगी और यही कारण है कि संकलक नल पॉइंटर के खिलाफ एक ही कोड यानी परीक्षण को परेशान नहीं करते हैं। यही कारण है कि आपका उदाहरण सभी मौजूदा कंपाइलर्स (संभवतः) पर झूठा परिणाम उत्पन्न करने में विफल रहता है। – Troubadour

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