La spécification C ++ définit-elle:
- l'existence de l'opérateur 'inférieur à' pour les paramètres booléens, et si c'est le cas,
- le résultat des 4 permutations de paramètres?
En d'autres termes, les résultats des opérations suivantes sont-ils définis par la spécification?
false < false
false < true
true < false
true < true
Sur ma configuration (Centos 7, gcc 4.8.2), le code ci-dessous crache ce à quoi je m'attendais (étant donné l'historique de C de représenter faux comme 0 et vrai comme 1):
false < false = false
false < true = true
true < false = false
true < true = false
Bien que je sois à peu près sûr que la plupart (tous?) Des compilateurs donneront le même résultat, est-ce que cela est légiféré par la spécification C ++? Ou un compilateur obscur, mais conforme aux spécifications, est-il autorisé à décider que true est moins que 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
surstd::vector<bool>
as&&
.p <= q
signifiep implies q
quandp
etq
sont de type booléen!<=
pourrait être lue par inadvertance comme une flèche vers la gauche , et que la flèche de droite "seulement si" (c'est-à-dire "[matériellement] implique") est parfois composée ou écrite de manière informelle de la même manière=>
(c'est- à -dire avec un arbre doublé ressemblant à=
) . Une flèche vers la gauche est même parfois lue comme «si», même si je pense que c'est beaucoup moins courant que l'utilisation d'une flèche vers la droite pour «seulement si».Réponses:
TL; DR:
Les opérations sont bien définies selon le projet de norme C ++.
Détails
On peut voir qu'en allant au projet standard C ++ section
5.9
Opérateurs relationnels qui dit ( Souligné par l'auteur à l' avenir ):et les booléens sont des types arithématiques de 3.9.1 Types fondamentaux
et
et
true
etfalse
sont des littéraux booléens à partir de2.14.6
littéraux booléens:Revenant à la section
5.9
pour voir plus loin la mécanique des opérateurs relationnels, il est dit:les conversions arithmétiques habituelles sont couvertes dans la section
5
qui dit:et la section
4.5
dit:et donc les expressions:
en utilisant ces règles deviennent:
la source
Les valeurs booléennes sont soumises aux promotions entières habituelles,
false
définies comme0
ettrue
définies comme1
. Cela rend toutes les comparaisons bien définies.la source
false
est défini0
et quitrue
est défini comme1
dans la norme (plutôt que simplement par la pratique courante) a besoin de preuves pour le soutenir.bool
type, avant même qu'il y ait C ++, le résultat d'une opération booléenne était défini comme0
pour false et1
pour true. Je ne serais pas surpris si vous pouvez le trouver dans K + R.<
(inférieur à),>
(supérieur à),<=
(inférieur ou égal à) et>=
(supérieur ou égal à) donnera 1 si la relation spécifiée est vraie et 0 si elle est false. Le résultat est de typeint
. "enum bool { false = 0, true = 1}
était légal mais ne définissait pas un fichieroperator<
.Selon la norme C ++ (5.9 Opérateurs relationnels)
et
et (3.9.1 Types fondamentaux)
et (4.5 promotions intégrales)
Donc, dans tous vos exemples, true est converti en int 1 et false est converti en int 0
Ces expressions
sont entièrement équivalents à
la source
Boolean
false
est équivalent àint 0
, et booleantrue
est équivalent àint 1
. Cela explique donc pourquoi l'expressionfalse < true
=>0 < 1
est la seule qui renvoietrue
.la source