web-dev-qa-db-fra.com

Comparaison des types de données booléens en C ++

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.

  1. bool x = 1;
    if (x==1)
        Do something.
    
  2. bool y = 0;
    if (y>0.5)
        Do something..
    
  3. bool z = 1;
    if(z>0.5)
        Do something...
    
16
rezabakhsh

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é

14
akib khan

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 deviennent true.

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 en int avec la valeur false devenant 0 et true devenant 1 .

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 en double

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.

9
songyuanyao

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.

6
eerorika

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.

4
idclev 463035818