2013-04-11 9 views
5

मैं इस तरह एक आउटपुट स्ट्रीम में एक bool प्रिंट:सी ++ प्रिंटिंग बूलियन, क्या प्रदर्शित होता है?

#include <iostream> 

int main() 
{ 
    std::cout << false << std::endl; 
} 

मानक धारा (जैसे false के लिए 0) पर एक विशिष्ट परिणाम आवश्यकता होती है?

+15

क्यों आप भी इसे आजमाना नहीं है? –

+2

हमें इसे कैसे बंद करना चाहिए? –

+0

संकेत: यह प्रत्येक अनुरूप कंपेलर पर एक ही चीज़ मुद्रित करने की गारंटी है। – chris

उत्तर

56

मानक धाराओं में boolalpha ध्वज है जो निर्धारित करता है कि क्या प्रदर्शित होता है - जब यह गलत होता है, तो वे 0 और 1 के रूप में प्रदर्शित होंगे। जब यह सच होता है, तो वे false और true के रूप में प्रदर्शित होंगे।

वहाँ भी इस है ध्वज सेट करने के लिए एक std::boolalpha जोड़तोड़, तो:

#include <iostream> 
#include <iomanip> 

int main() { 
    std::cout<<false<<"\n"; 
    std::cout << std::boolalpha; 
    std::cout<<false<<"\n"; 
    return 0; 
} 

... पैदा करता है उत्पादन की तरह:

0 
false 

क्या इसके लायक है के लिए, वास्तविक शब्द का उत्पादन किया boolalpha है जब सत्य पर सेट किया गया है - <locale> में num_put श्रेणी है जो संख्यात्मक रूपांतरणों को संभालती है, इसलिए यदि आप सही लोकेल के साथ एक स्ट्रीम प्राप्त करते हैं, तो यह true औरप्रिंट कर सकता है 210 के रूप में वे उस लोकेल में प्रतिनिधित्व कर रहे हैं। उदाहरण के लिए,

#include <iostream> 
#include <iomanip> 
#include <locale> 

int main() { 
    std::cout.imbue(std::locale("fr")); 

    std::cout << false << "\n"; 
    std::cout << std::boolalpha; 
    std::cout << false << "\n"; 
    return 0; 
} 

... और कम से कम सिद्धांत रूप में (यह मानते हुए अपने संकलक/मानक पुस्तकालय "fr" को स्वीकार करने के लिए "फ्रेंच" एक पहचानकर्ता के रूप में) यह पता faux बजाय false मुद्रित हो सकता है। हालांकि, मुझे यह जोड़ना चाहिए कि इसके लिए असली समर्थन असमान है - यहां तक ​​कि डिनकुमवेयर/माइक्रोसॉफ्ट लाइब्रेरी (आमतौर पर इस संबंध में काफी अच्छा) प्रिंट की गई प्रत्येक भाषा के लिए false प्रिंट करता है।

उपयोग किए जाने वाले नाम numpunct पहलू में परिभाषित किए गए हैं, इसलिए यदि आप वास्तव में उन्हें विशेष भाषा के लिए सही ढंग से प्रिंट करना चाहते हैं, तो आप ऐसा करने के लिए numpunct पहलू बना सकते हैं। उदाहरण के लिए, एक ही है कि (मेरा मानना ​​है कि) कम से कम यथोचित फ्रेंच के लिए सटीक है इस प्रकार दिखाई देगा:

#include <array> 
#include <string> 
#include <locale> 
#include <ios> 
#include <iostream> 

class my_fr : public std::numpunct<char> { 
protected: 
    char do_decimal_point() const { return ','; } 
    char do_thousands_sep() const { return '.'; } 
    std::string do_grouping() const { return "\3"; } 
    std::string do_truename() const { return "vrai"; } 
    std::string do_falsename() const { return "faux"; } 
}; 

int main() { 
    std::cout.imbue(std::locale(std::locale(), new my_fr)); 

    std::cout << false << "\n"; 
    std::cout << std::boolalpha; 
    std::cout << false << "\n"; 
    return 0; 
} 

और परिणाम है (जैसा कि आप शायद उम्मीद थी):

0 
faux 
+3

नोट के लिए स्पष्ट हो: जब std :: boolalpha का उपयोग "सत्य" प्रिंट करने में सक्षम हो सकता है या 0 या 1 के बजाय "झूठी", आप विपरीत (प्रिंटिंग 0 या 1) को फिर से करने के लिए std :: noboolalpha का उपयोग कर सकते हैं –

+0

क्या यह 'नया' स्मृति रिसाव नहीं है? – Creep4Play

+0

@ क्रीप 4 प्ले: नहीं - डिफ़ॉल्ट रूप से आप लोकेल को पहलू का स्वामित्व दे रहे हैं, जो लोकेल नष्ट होने पर स्वचालित रूप से इसे नष्ट कर देगा। –

10

0 होगा मुद्रित हो जाओ।

जैसा कि C++ सच संदर्भित करता है और को गलत को संदर्भित करता है।

मामले में, आप मुद्रित करने के लिए झूठी की बजाय चाहते हैं, तो आप str स्ट्रीम के लिए boolalpha प्रारूप ध्वज सेट करने के लिए है।

जब बूलल्फा प्रारूप ध्वज सेट किया जाता है, तो बूल मानों को उनके पाठपरक प्रतिनिधित्व द्वारा डाला/निकाला जाता है: या तो अभिन्न मूल्यों के बजाय सत्य या गलत।

#include <iostream> 
int main() 
{ 
    std::cout << std::boolalpha << false << std::endl; 
} 

उत्पादन:

false 

IDEONE

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