Подтвердить что ты не робот

С++ print boolean, что отображается?

Я печатаю bool в выходной поток следующим образом:

#include <iostream>

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

Требуется ли стандарту конкретный результат в потоке (например, 0 для false)?

4b9b3361

Ответ 1

Стандартные потоки имеют флаг 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 установлено в true, локализовано, то есть <locale> имеет категорию num_put, которая обрабатывает числовые преобразования, поэтому, если вы наполните поток правильной locale, он может/будет распечатывать true и false, поскольку они представлены в этой локали. Например,

#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" как идентификатор для "French" ), она может распечатывать 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

Ответ 2

0 будет напечатано.

Как и в С++ true относится к 1 и false относится к 0.

В случае, если вы хотите напечатать false вместо 0, тогда вы должны установить флаг формата boolalpha для потока str.

Когда установлен флаг формата boolalpha, значения bool вставляются/извлекаются их текстовым представлением: либо true, либо false вместо целых значений.

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

Выход:

false

IDEONE