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