2015-12-30 7 views
6

बूल को वास्तविक मानों के लिए 1 में परिवर्तित किया जाना चाहिए और 0 अन्यथा। हालांकि, यह कुछ भी नहीं कहता है कि वे वास्तव में स्मृति में कैसे संग्रहीत किए जा सकते हैं। क्या होता है यदि मैं एक बूल में मनमानी गैर-शून्य मान संग्रहीत करता हूं? क्या इन चीजों को काटते समय मानक मानक सही व्यवहार की गारंटी देता है?क्या एक कंपाइलर बूल में मनमाने ढंग से गैर-शून्य मान को सही तरीके से समझना चाहिए?

उदाहरण के लिए, निम्नलिखित कार्यक्रम को देखते हुए

#include <string.h> 

int main() 
{ 
    bool b; 
    memset(&b, 123, sizeof(b)); 

    return b; 
} 

मानक गारंटी कार्यक्रम 1 वापसी होगी है?

+1

यदि आप इसे एक बड़े-एंडियन सीपीयू पर चलाते हैं, तो आप '0' वापस लौटने की संभावना रखते हैं। –

+2

@mark: memset सभी बाइट्स को एक ही मान पर सेट करता है (123/इस मामले में) – rici

+0

* "मानक मानक सही व्यवहार की गारंटी देता है ..." * - मानक * हमेशा * परिभाषा के अनुसार सही व्यवहार की गारंटी देता है ** , क्योंकि जब यह व्यवहार को परिभाषित करता है तो किसी भी अनुकूल कार्यान्वयन को प्रदान करना चाहिए, और जब कोई व्यवहार सही नहीं होता है।"बूल्स माना जाता है" में आपका नेतृत्व का तात्पर्य है कि आपके पास 'int {1}' दिमाग में "सही" होने के रूप में दिमाग है, लेकिन यह ज्ञापन है कि 'स्मृति' को अपरिभाषित व्यवहार का कारण बनता है। –

उत्तर

4

नहीं, यादृच्छिक व्यवहार (कम से कम, नीचे देखें) अनिश्चित व्यवहार के बाद उस बूल से पढ़ना, इसलिए कोई गारंटी नहीं है कि मूल्य क्या लौटाया जाएगा।

यह पता बदल सकता है कि विशेष रूप वास्तुकला में, एक bool का मूल्य प्रतिनिधित्व, केवल उच्च आदेश बिट के होते हैं जो मामले बाइट (ओं) का bool बारी होगा से अधिक 123 प्रसारण द्वारा उत्पादित मूल्य में false का प्रतिनिधित्व करने के लिए बाहर।

सी ++ मानक निर्दिष्ट नहीं करता है कि true और false मानों का प्रतिनिधित्व करने वाले वास्तविक बिट पैटर्न क्या हैं। एक कार्यान्वयन bool के ऑब्जेक्ट प्रस्तुति में किसी भी या सभी बिट्स का उपयोग कर सकता है - जो कम से कम एक बाइट होना चाहिए, लेकिन यह लंबा हो सकता है - और यह एक ही मान के लिए एक से अधिक बिट पैटर्न को मैप कर सकता है:

§ 3.9.1 [basic.fundamental]/1:

है & hellip; संकीर्ण चरित्र प्रकार के लिए, वस्तु प्रतिनिधित्व के सभी बिट्स मूल्य प्रतिनिधित्व में भाग लेते हैं। हस्ताक्षरित संकीर्ण चरित्र प्रकारों के लिए, मूल्य प्रतिनिधित्व का प्रत्येक संभव बिट पैटर्न एक अलग संख्या का प्रतिनिधित्व करता है। ये आवश्यकताएं अन्य प्रकारों के लिए नहीं हैं।

एक ही अनुभाग के अनुच्छेद 6 प्रकार bool के मूल्यों या तो true या false होने की आवश्यकता है, लेकिन एक फुटनोट बताते हैं कि अपरिभाषित व्यवहार का सामना करने में एक bool "के रूप में अगर यह न तो सही है और न ही गलत है व्यवहार करते हैं हो सकता है। " (यह अपरिभाषित व्यवहार की सीमा के भीतर स्पष्ट रूप से है, अगर एक कार्यक्रम दर्शाती यूबी, वहाँ कोई आवश्यकताओं इसके निष्पादन पर जो भी कर रहे हैं, पहले भी यूबी इसका सबूत है।) मानक परमिट पर निम्न स्तर के स्मृति नकल आपरेशन का उपयोग करने में

कुछ भी नहीं है संकीर्ण वर्णों के सरणी के अलावा अन्य वस्तुएं, उस मामले को छोड़कर जिसमें ऑब्जेक्ट त्रिकोणीय रूप से कॉपी करने योग्य है और ऑब्जेक्ट प्रस्तुति इसे बफर में कॉपी करके सहेजी जाती है और बाद में इसे कॉपी करके पुन: स्थापित की जाती है। सी लाइब्रेरी फ़ंक्शंस का कोई अन्य उपयोग जो ऑब्जेक्ट प्रस्तुति में मनमानी बाइट्स को ओवरराइट करता है, अनिर्धारित व्यवहार की सामान्य परिभाषा ("[मानक] व्यवहार की किसी भी स्पष्ट परिभाषा को छोड़ देता है") द्वारा परिभाषित किया जाना चाहिए। लेकिन मुझे इस बात से सहमत होने के लिए मजबूर होना पड़ता है कि memset यूबी है, और इसलिए मैं अनिर्दिष्ट व्यवहार पर बसूंगा, जो bool के प्रतिनिधित्व के बाद से स्पष्ट रूप से स्पष्ट नहीं है।

+1

खैर, एफडब्ल्यूआईडब्ल्यू, दोनों जीसीसी और क्लैंग इसे 1 लौटाते हैं, जो मुझे उस मामले में अजीब लगेगा, क्योंकि यह मेरे लिए एक अतिरिक्त काम की तरह प्रतीत होता है। – dragonroot

+3

@dragonroot: अपरिभाषित व्यवहार को ऐसा करने की अनुमति है। :) – rici

+0

एक अच्छा जवाब की तरह लगता है, लेकिन मैं इस बारे में और अधिक सराहना करता हूं कि यह अनिर्धारित क्यों हो जाता है। –

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