Le type de données bool
est généralement représenté par 0
(comme false
) et 1
(comme true
). Cependant, certains disent que les valeurs true
peuvent être représentées par une valeur autre que 1
. Si la dernière instruction est true
, l'expression suivante peut être incorrecte.
bool x = 1;
if (x==1)
Do something..
Je me demande si les déclarations suivantes fonctionneraient comme souhaité et attendu sur les compilateurs couramment utilisés.
bool x = 1;
if (x==1)
Do something.
bool y = 0;
if (y>0.5)
Do something..
bool z = 1;
if(z>0.5)
Do something...
Le §4.5 de la norme C++ dit:
Une rvalue de type bool peut être convertie en une rvalue de type int, false devenant nul et true devenant un.
en ce qui concerne 2 et 3, la conversion de type a lieu afin que les instructions fonctionnent comme souhaité
Selon la règle de conversions booléennes :
Une valeur de type d'énumération, de pointeur et de pointeur sur membre intégral, à virgule flottante, non étendue peut être convertie en une valeur de type
bool
.La valeur zéro (pour l'énumération intégrale, à virgule flottante et non étendue) et le pointeur nul et les valeurs pointeur à membre nul deviennent
false
. Toutes les autres valeurs deviennenttrue
.
Ensuite
bool x = 1; // x will be true
bool y = 0; // y will be false
bool z = 1; // z will be true
Pour le 1er cas, if (x==1)
, x
sera prom à int
,
le type
bool
peut être converti enint
avec la valeurfalse
devenant0
ettrue
devenant1
.
alors (x==1)
est true
.
Pour le deuxième cas, if (y>0.5)
, y
sera promu en int
avec la valeur 0
, Puis converti en double
pour le comparaison ;
Si les opérandes ont un type arithmétique ou d'énumération (portée ou non), les conversions arithmétiques habituelles sont effectuées sur les deux opérandes en suivant les règles des opérateurs arithmétiques. Les valeurs sont comparées après les conversions:
et
Si l'opérande transmis à un opérateur arithmétique est de type énumération intégrale ou non étendue, puis avant toute autre action (mais après la conversion de lvalue en rvalue, le cas échéant), l'opérande subit une promotion intégrale.
...
- Sinon, si l'un des opérandes est
double
, l'autre opérande est converti endouble
alors y>0.5
est false
.
Pour le troisième cas, if (z>0.5)
, z
sera promu en int
avec la valeur 1
, Puis converti en double
pour le comparaison ; alors z>0.5
est true
.
if (x==1)
n'est pas incorrect. Toutes les représentations de valeur réelle sont converties en 1 lorsque vous convertissez un booléen en type numérique.
Étant donné bool z=true
, if(z>0.5)
sera vrai, car 1.0 est supérieur à 0,5.
bool
n'a que deux valeurs, et ce sont true
et false
. 1
et 0
sont des littéraux entiers et peuvent donc être convertis en bool
. Vous devez considérer que la conversion fonctionne dans les deux sens, mais vous ne récupérez pas nécessairement le même entier:
int a = 5;
bool b = a; // int -> bool conversion
int c = b; // bool -> int conversion
std::cout << a << " " c;
impressions:
5 1
Toute valeur entière autre que 0
est converti en true
, mais true
est toujours converti en 1
.
En gardant cela à l'esprit, tous vos exemples fonctionneront comme prévu. Cependant, notez que le but principal de bool
est que nous pouvons utiliser true
et false
dans notre code au lieu d'avoir à donner des nombres comme 0
et 1
sens spécial. Il vaut toujours mieux être explicite, donc quand vous voulez dire true
vous feriez mieux d'écrire true
pas 1
.