Определяет ли спецификация C ++:
- существование оператора «меньше чем» для логических параметров, и если да,
- результат перестановок с 4 параметрами?
Другими словами, определяются ли результаты следующих операций спецификацией?
false < false
false < true
true < false
true < true
На моей установке (Centos 7, gcc 4.8.2) приведенный ниже код выплевывает то, что я ожидал (учитывая историю C, представляющую false как 0 и true как 1):
false < false = false
false < true = true
true < false = false
true < true = false
Хотя я почти уверен, что большинство (все?) Компиляторов будут выдавать один и тот же вывод, регулируется ли это спецификацией C ++? Или же запутанный, но совместимый со спецификацией компилятор позволил решить, что true меньше, чем false?
#include <iostream>
const char * s(bool a)
{
return (a ? "true" : "false");
}
void test(bool a, bool b)
{
std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}
int main(int argc, char* argv[])
{
test(false, false);
test(false, true);
test(true, false);
test(true, true);
return 0;
}
std::min
наstd::vector<bool>
как&&
.p <= q
означает,p implies q
когдаp
иq
имеют тип bool!<=
может быть случайно прочитано в виде левой стрелки, и что правая стрелка «только если» (т. Е. «[Материально] подразумевает») иногда набирается или неофициально пишется аналогично=>
(т. Е. С удвоенным стержнем, напоминающим=
) , Левая стрелка даже иногда читается как «если», хотя я считаю, что это гораздо реже, чем использование правой стрелки для «только если».Ответы:
TL; DR:
Операции четко определены в соответствии с проектом стандарта C ++.
подробности
Мы можем увидеть это, перейдя к черновому стандартному разделу C ++ «
5.9
Реляционные операторы», в котором говорится ( выделение мое в дальнейшем )и bools являются арифметическими типами из 3.9.1 Фундаментальные типы
и
и
true
иfalse
являются логическими литералами из2.14.6
логических литералов:Возвращаясь к разделу,
5.9
чтобы узнать подробнее о механизме реляционных операторов, он говорит:что обычные арифметические преобразования рассматриваются в разделе ,
5
который говорит:и раздел
4.5
говорит:и так выражения:
с помощью этих правил становятся:
источник
Булевы значения подчиняются обычным целочисленным повышениям, которые
false
определены как0
иtrue
определены как1
. Это делает все сравнения хорошо определенными.источник
false
определен как0
иtrue
определен как1
в стандарте (а не только в обычной практике), нуждается в доказательствах, подтверждающих его.bool
тип, до того, как появился C ++, результат логической операции был определен как0
для false и1
для true. Я не удивлюсь, если вы найдете это в K + R.<
(меньше),>
(больше чем),<=
(меньше или равно) и>=
(больше или равно) должен давать 1, если указанное отношение истинно, и 0, если оно равно false. Результат имеет типint
. "enum bool { false = 0, true = 1}
было законно, но не определеноoperator<
.Согласно стандарту C ++ (5.9 Реляционные операторы)
и
и (3.9.1 Основные типы)
и (4.5 Интегральные акции)
Таким образом, во всех ваших примерах true конвертируется в int 1, а false конвертируется в int 0
Эти выражения
полностью эквивалентны
источник
Булево
false
эквивалентноint 0
, а булевоtrue
эквивалентноint 1
. Таким образом, это объясняет, почему выражениеfalse < true
=>0 < 1
является единственным, которое возвращаетtrue
.источник