OVH Cloud OVH Cloud

Type bool en C++

13 réponses
Avatar
Pierre Maurette
Bonjour,
J'aimerais avoir des avis sur l'utilité du type bool en C++.
J'ai fait des tests sur quelques compilateurs (tous sous Windows),
configurés au plus près de la norme ANSI/ISO. Les résultats, bien que
conformes à la norme, sont troublants.

<code>
bool A = true;
bool B = true;
bool C;

C = (1>0) + (2>3) + (17>0) + (100>10);
printf("(printf)C -> : %u\n", C);
cout << " (cout)C -> : " << C << endl << endl;

C = A + B + A + B;
printf("(printf)C -> : %u\n", C);
cout << " (cout)C -> : " << C << endl << endl;

C = true;
C += C;

printf("(printf)C -> : %u\n", C);
cout << " (cout)C -> : " << C << endl;

if(C==true)cout << "C est vrai !" << endl << endl;
else cout << "C est faux !" << endl << endl;

C++;
printf("(printf)C -> : %u\n", C);
cout << " (cout)C -> : " << C << endl << endl;
</code>
(il aurait été plus correct de remplacer les printf() par des cout << (int)C
..., pour le même résultat)

Les résultats en GCC et VC6 sont conformes à "ma" logique :
<résultats>
(printf)C -> : 1
(cout)C -> : 1

(printf)C -> : 1
(cout)C -> : 1

(printf)C -> : 1
(cout)C -> : 1
C est vrai !

(printf)C -> : 1
(cout)C -> : 1
</résultats>

Avec Borland (5.5 et C++Builder 6 en compilation ANSI, ce qui n'est pas
simple !).
<résultats>
(printf)C -> : 1
(cout)C -> : 1

(printf)C -> : 1
(cout)C -> : 1

(printf)C -> : 2
(cout)C -> : 1
C est faux !

(printf)C -> : 3
(cout)C -> : 1
</résultats>

Si c'est pour ce genre de comportement, je ne vois pas l'intérêt d'un type
bool. A la limite, je préfère comme en C rester sur des int, et
éventuellement faire un :
typedef enum {false = (1 == 0), true = !false} bool;
ou
typedef enum {faux = (1 == 0), vrai = !faux} booleen;
en sachant au moins à quoi m'attendre.
Je ne comprends pas que les opérations d'arithmétique entière soient
acceptées (sans warning semble-t-il) sur de booléens. La raison pourrait
être que les comparaisons renvoient un int en C. Mais :
if((10<a)+(12>b)){...}
n'est certainement pas excellent et pourrait facilement être corrigé.
On peut sans problème comparer à false (if(C!=false) est correct), mais
jamais à true, ni à un autre bool.
L'égalité de deux bool (un OU exclusif, en fait) doit s'écrire (par
exemple):
if((A&&B)||(!A&&!B)){}
Donc, mes questions :
- Comment justifier la timidité de la norme ?
- Comment justifier le laxisme de Borland ?
Merci
Pierre

3 réponses

1 2
Avatar
Gabriel Dos Reis
writes:

| Après tout, le résultat de « c != false », c'est bien une valeur
| booléene lui aussi. Alors, est-ce qu'il faut écrire « (c != false) = | true » ?


((c != false) == true) == true

-- Gaby
Avatar
Michaël Monerau
Gabriel Dos Reis wrote:
writes:

Après tout, le résultat de « c != false », c'est bien une valeur
booléene lui aussi. Alors, est-ce qu'il faut écrire « (c != false) = >> true » ?



((c != false) == true) == true


Non, tu oublies que le dernier `== true' renvoie lui aussi un bool. Du coup,
je pense qu'il faut faire un appel à une fonction récursive.

;-)
--
<=- Michaël "Cortex" Monerau -=>


Avatar
Christophe Lephay
Michaël Monerau wrote:
Gabriel Dos Reis wrote:
writes:

Après tout, le résultat de « c != false », c'est bien une valeur
booléene lui aussi. Alors, est-ce qu'il faut écrire « (c != false)
== true » ?



((c != false) == true) == true


Non, tu oublies que le dernier `== true' renvoie lui aussi un bool.
Du coup, je pense qu'il faut faire un appel à une fonction récursive.


bool is_true( bool condition )
{
return is_true( condition == true );
}

Chris



1 2