2013-04-11 139 views
5

tôi in một bool tới luồng ra như thế này:C++ in boolean, những gì được hiển thị?

#include <iostream> 

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

Liệu tiêu chuẩn đòi hỏi một kết quả cụ thể trên dòng (ví dụ 0 cho false)?

+15

Tại sao bạn không thử? –

+2

Chúng ta nên đóng cái này như thế nào? –

+0

Gợi ý: nó được đảm bảo để in cùng một điều trên mỗi trình biên dịch phù hợp. – chris

Trả lời

56

Luồng tiêu chuẩn có cờ boolalpha xác định nội dung được hiển thị - khi sai, chúng sẽ hiển thị là 01. Khi đúng, chúng sẽ hiển thị là falsetrue.

Ngoài ra còn có một std::boolalpha thao túng để đặt cờ, vì vậy đây:

#include <iostream> 
#include <iomanip> 

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

... sản xuất ra như:

0 
false 

Đối với những gì nó có giá trị, từ thực tế sản xuất khi boolalpha là được đặt thành true được bản địa hóa - tức là, <locale> có một danh mục num_put xử lý chuyển đổi số, vì vậy nếu bạn truyền một luồng có đúng ngôn ngữ, nó có thể/sẽ in ra truefalse khi chúng được thể hiện bằng ngôn ngữ đó. Ví dụ,

#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; 
} 

... và ít nhất về mặt lý thuyết (giả sử biên dịch/thư viện tiêu chuẩn của bạn chấp nhận "fr" như một định danh cho "Pháp") nó có thể in ra faux thay vì false. Tuy nhiên, tôi nên thêm rằng hỗ trợ thực sự cho điều này là không đồng đều ở mức tốt nhất - ngay cả thư viện Dinkumware/Microsoft (thường khá tốt về mặt này) in false cho mọi ngôn ngữ tôi đã kiểm tra.

Tên được sử dụng được xác định trong một khía cạnh numpunct, vì vậy nếu bạn thực sự muốn chúng in chính xác cho ngôn ngữ cụ thể, bạn có thể tạo một khía cạnh numpunct để làm điều đó. Ví dụ, một trong đó (tôi tin) là ít nhất một cách hợp lý chính xác cho Pháp sẽ trông như thế này:

#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; 
} 

Và kết quả là (như bạn có thể mong đợi):

0 
faux 
+3

: khi std :: boolalpha có thể được sử dụng để cho phép in" true " hoặc "sai" thay vì 0 hoặc 1, bạn có thể sử dụng lệnh std :: noboolalpha để làm điều ngược lại (in 0 hoặc 1) một lần nữa –

+0

Đó có phải là 'mới' rò rỉ bộ nhớ không? – Creep4Play

+0

@ Creep4Play: Không - theo mặc định, bạn đang cung cấp quyền sở hữu của các khía cạnh cho miền địa phương, sẽ tự động hủy nó khi ngôn ngữ bị hủy. –

10

0 sẽ được in.

Giống như C++ đúng đề cập đến và sai đề cập đến .

Trong trường hợp, bạn muốn in sai thay vì , sau đó bạn phải thiết lập định dạng cờ boolalpha cho dòng str.

Khi cờ định dạng boolalpha được đặt, giá trị bool được chèn/trích xuất bằng cách trình bày văn bản của chúng: đúng hoặc sai, thay vì giá trị tích phân.

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

đầu ra:

false 

IDEONE