2012-04-03 5 views
6

मेरे कोड में कुछ दावों ने अभी अजीब अभिनय करना शुरू कर दिया, और मैं सोच रहा था कि किसी के पास पहले जैसी ही स्थिति थी। की तरह एक छोटी कोड स्निपेट:अजीब जोर तार्किक और बूल चर पर

#include <cassert> 

class A{ 
    protected: 
     bool isM, isN; 

    public: 
     void someFunction(); 
}; 

A::someFunction(){ 
    assert (this->isM && this->isN); 

    ... 
} 

एक assertion failed परिणाम पैदा करता है। दूसरी तरफ, कोड को थोड़ा सा बदलने के बाद:

A::someFunction(){ 
    assert(this->isM); 
    assert(this->isN); 

    ... 
} 

दावा किसी भी समस्या के साथ गुजरता है और कार्य सामान्य रूप से समाप्त होता है। फ़ंक्शन परिष्करण सामान्य रूप से अपेक्षित कार्यक्षमता है, क्योंकि bool चर someFunction() पर वास्तविक कॉल से पहले सेट किए गए हैं।

एक अतिरिक्त प्रश्न के रूप में, क्या सी ++ में दावा करने का एक बेहतर तरीका है? मैं सी पर बड़ा हुआ हूं, और अभी भी सी-शैली के दावे का उपयोग कर रहा हूं। मैंने अभी इस पर Google की सतह खरोंच की है, लेकिन कुछ भी नया संकेत देने के लिए कुछ भी नहीं मिला है।

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

+0

क्या आपका मतलब है कि 'बूल' चर 'कॉल' से पहले कुछ फ़ंक्शन() 'पर सेट किए गए हैं? – juanchopanza

+0

क्या बूल सेट हैं या नहीं? – dexametason

+0

सी ++ 11 'static_assert' लाता है, जो एक संकलन समय दावा है। मुझे लगता है कि यह पिछले सी ++ संस्करणों के लिए भी बढ़ावा पर उपलब्ध है। – RedX

उत्तर

3

बूलियन अनियंत्रित हैं। वे कोई मूल्य ले सकते हैं। यहां व्यवहार अपरिभाषित है। कि समझाने के लिए, ubuntu 11.10 पर एक जीसीसी 4.7 स्नैपशॉट का उपयोग कर:

#include <iostream> 

struct A { 
    bool a, b; 
}; 

int main() { 

    A a0; 
    std::cout << a0.a << ", " << a0.b << "\n"; 

    A a1; 
    std::cout << a1.a << ", " << a1.b << "\n"; 

} 

इस उत्पादन का उत्पादन:

121, 0 
244, 31 

या, फिर से चलाने

192, 0 
244, 127 

या, -O3 साथ अनुकूलन एक शून्य का गुच्छा।

+0

आपके द्वारा रखे गए आउटपुट स्निपेट के बीच क्या अंतर है? – penelope

+0

@penelope मैंने अभी कार्यक्रम दो बार चलाया। – juanchopanza

+0

आह :) वे पूरी तरह से वही हैं। मुझे लगता है कि – penelope