У меня есть это задание, которое я выполнил. Я использую логическое значение, чтобы оно печатало 1 или 0. Мой вопрос в том, как заставить его печатать true или false вместо 1 или 0.
Мой вывод:
1 = true, 0 = false
------------
c1 >= c2 : 1
c1 <= c2 : 0
c1 != c2 : 1
c1 < c2 : 0
c1 > c2 : 1
c1 == c2 : 0
Мой код
int main()
{
//Declearing the radii of 2 circles in order to compare
Circle c1(7);
Circle c2(6);
//prints true or false in boolean so 1 or 0
bool compare;
cout << "1 = true, 0 = false" << endl;
cout << "------------" << endl;
compare = c1 >= c2;
cout<< "c1 >= c2 : "<< compare << endl;
compare = c1 <= c2;
cout<< "c1 <= c2 : "<< compare << endl;
compare = c1 != c2;
cout << "c1 != c2 : " << compare << endl;
compare = c1 < c2;
cout<< "c1 < c2 : " << compare << endl;
compare = c1 > c2;
cout << "c1 > c2 : " << compare << endl;
compare = c1 == c2;
cout << "c1 == c2 : " << compare << endl;
cout << endl;
}
Это многофайловая программа, поэтому я добавил только main.cpp. Мы будем очень признательны за любые советы.
@ pm100 Сделайте это ответом.
Другая возможность — std::boolalpha
@ pm100 Я не думаю, что это работает. Я получаю сообщение об ошибке «main.cpp: 45: 19: предупреждение: результат выражения не используется [-Wunused-value]»
pm100 означает что-то вроде cout<< "c1 >= c2 : "<< (compare ? "true" : "false") << endl;
, а не (compare ? "true":"false")
как отдельное выражение (которое действительно ничего не даст).
std::string s[] = { "ложь", "истина" }; std::cout << s[сравнить];
@AllanWind в этом примере я бы использовал const char*
вместо этого, чтобы избежать накладных расходов на создание ненужных std::string
объектов: const char* s[] = { "false", "true" };
@RemyLebeau Я на самом деле написал это первым, но решил, что единовременные накладные расходы не имеют большого значения. Обновите ответ только для вас :-)
Похоже, у нас есть несколько хороших вариантов (упорядоченных по времени отправки):
std::cout << (compare ? "true" : "false");
std::cout << std::boolalpha << compare;
const char *s[] = { "false", "true" }; std::cout << s[compare];
И я бы «проголосовал за дверь №1», потому что это сразу видно. Для любого из двух других, если бы я столкнулся с ним где-нибудь в производственном коде, «мне пришлось бы подумать». И в таких ситуациях я бы предпочел не делать этого. «Сделайте свой код максимально понятным».
@MikeRobinson # 2 уважает локаль, а два других - нет. Так что, безусловно, есть повод для его использования.
Мне тоже очень нравится третичный оператор, но 2-й вариант был бы наиболее кратким при многократном использовании, как здесь.
Я мог бы даже сделать это на C, если бы торопился, но для C++ это слишком грязно: const char *s = "false\0true"; size_t false_len = strlen(s) + 1; printf("%s", s + compare * false_len);
Один небольшой аргумент против std::boolalpha
заключается в том, что он изменяет поток. В общем, было бы предпочтительнее оставить поток таким, каким вы его нашли. Но сохранение и восстановление этого состояния раздражает и быстро становится аргументом в пользу варианта №1. Тем не менее, boolalpha
сам по себе — это то, что вы обычно хотите оставить включенным для потока. Но просто для полноты можно сделать std::cout << (std::ostringstream() << std::boolalpha << compare).str()
. Самое простое, конечно, просто применить boolalpha
в начале программы и больше никогда к ней не прикасаться.
(compare ? "true":"false")
будет работать