C ++打印布尔值,显示什么?

时间:2013-04-11 22:31:27

标签: c++ boolean cout

我将bool打印到输出流,如下所示:

#include <iostream>

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

标准是否要求流上的特定结果(例如0false)?

2 个答案:

答案 0 :(得分:73)

标准流有一个boolalpha标志,用于确定显示的内容 - 当它为假时,它们将显示为01。如果是真的,它们将显示为falsetrue

还有一个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设置为true时生成的实际单词是本地化的 - 也就是说,<locale>有一个num_put类别来处理数字转换,所以如果你使用正确的区域设置填充流,它可以/将打印出truefalse,因为它们在该区域设置中表示。例如,

#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。但是,我应该补充一点,对此的真正支持充其量是不均衡的 - 即使是Dinkumware / Microsoft库(在这方面通常相当不错)也会为我检查的每种语言打印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

答案 1 :(得分:15)

0将被打印。

与C ++一样 true 1 false 0

如果您要打印 false 而不是 0 ,则必须为str流设置boolalpha格式标记。

当设置boolalpha格式标志时,bool值通过其文本表示插入/提取:true或false,而不是整数值。

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

<强>输出

false

<强> IDEONE