Y a-t-il un spécificateur de format particulier pour les booléens ?
Un professeur de _java_ se plaignait de ce qu'on ne pouvait pas avoir de
booléens en C, alors je lui ai fait remarquer qu'on pouvait soit les
définir soi-même, soit recourir au "bool" du C99.
Et du tac au tac il m'a sorti "et comment tu fais pour afficher true et
false !?"
(avec %s et ( x == true ? "true" : "false"), mais bon peut-être
existe-t-il des spécificateurs de format pour les booléens, du coup ?)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Emmanuel Delahaye
In 'fr.comp.lang.c', gregg wrote:
Y a-t-il un spécificateur de format particulier pour les booléens ?
Un professeur de _java_ se plaignait de ce qu'on ne pouvait pas avoir de booléens en C, alors je lui ai fait remarquer qu'on pouvait soit les définir soi-même, soit recourir au "bool" du C99. Et du tac au tac il m'a sorti "et comment tu fais pour afficher true et false !?"
(avec %s et ( x == true ? "true" : "false"), mais bon peut-être existe-t-il des spécificateurs de format pour les booléens, du coup ?)
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
In 'fr.comp.lang.c', gregg <greggory@netJUSTSAYNOcourrier.com> wrote:
Y a-t-il un spécificateur de format particulier pour les booléens ?
Un professeur de _java_ se plaignait de ce qu'on ne pouvait pas avoir de
booléens en C, alors je lui ai fait remarquer qu'on pouvait soit les
définir soi-même, soit recourir au "bool" du C99.
Et du tac au tac il m'a sorti "et comment tu fais pour afficher true et
false !?"
(avec %s et ( x == true ? "true" : "false"), mais bon peut-être
existe-t-il des spécificateurs de format pour les booléens, du coup ?)
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
--
-ed- emdelYOURBRA@noos.fr [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
Y a-t-il un spécificateur de format particulier pour les booléens ?
Un professeur de _java_ se plaignait de ce qu'on ne pouvait pas avoir de booléens en C, alors je lui ai fait remarquer qu'on pouvait soit les définir soi-même, soit recourir au "bool" du C99. Et du tac au tac il m'a sorti "et comment tu fais pour afficher true et false !?"
(avec %s et ( x == true ? "true" : "false"), mais bon peut-être existe-t-il des spécificateurs de format pour les booléens, du coup ?)
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
gregg
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui font remarquer les incomparables avancées du langage machin sur le C m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false" comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me renseigner.
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets...
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui
font remarquer les incomparables avancées du langage machin sur le C
m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false"
comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me
renseigner.
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour
utiliser deux valeurs on utilise au moins deux octets...
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui font remarquer les incomparables avancées du langage machin sur le C m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false" comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me renseigner.
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets...
Bernard Bandiera
gregg écrivait dans le message 402528df$0$28126$ :
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui font remarquer les incomparables avancées du langage machin sur le C m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false" comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me renseigner.
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets...
Je comprends ce prof, c'est vraiment important d'afficher TRUE à la place de 1, ça fait vachement plus "pro", et ça aide vraiment à développer des applications fiables et propres ;-) Non, sans blaguer, il a rien d'autre à faire, ce prof ? Sinon, il pourrait se recycler en philosophie, ce sujet aurait sa place... pas en informatique !
-- Bernard
Gloire à qui, n'ayant pas d'idéal sacro-saint Se borne à ne pas trop emmerder son voisin Georges Brassens - Don Juan
gregg écrivait dans le message 402528df$0$28126$636a15ce@news.free.fr :
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens
qui font remarquer les incomparables avancées du langage machin sur
le C m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false"
comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à
me renseigner.
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour
utiliser deux valeurs on utilise au moins deux octets...
Je comprends ce prof, c'est vraiment important d'afficher TRUE à la place de
1, ça fait vachement plus "pro", et ça aide vraiment à développer des
applications fiables et propres ;-)
Non, sans blaguer, il a rien d'autre à faire, ce prof ? Sinon, il pourrait
se recycler en philosophie, ce sujet aurait sa place... pas en informatique
!
--
Bernard
Gloire à qui, n'ayant pas d'idéal sacro-saint
Se borne à ne pas trop emmerder son voisin
Georges Brassens - Don Juan
gregg écrivait dans le message 402528df$0$28126$ :
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui font remarquer les incomparables avancées du langage machin sur le C m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false" comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me renseigner.
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets...
Je comprends ce prof, c'est vraiment important d'afficher TRUE à la place de 1, ça fait vachement plus "pro", et ça aide vraiment à développer des applications fiables et propres ;-) Non, sans blaguer, il a rien d'autre à faire, ce prof ? Sinon, il pourrait se recycler en philosophie, ce sujet aurait sa place... pas en informatique !
-- Bernard
Gloire à qui, n'ayant pas d'idéal sacro-saint Se borne à ne pas trop emmerder son voisin Georges Brassens - Don Juan
Richard Delorme
Emmanuel Delahaye wrote:
In 'fr.comp.lang.c', gregg wrote:
Y a-t-il un spécificateur de format particulier pour les booléens ?
Un professeur de _java_ se plaignait de ce qu'on ne pouvait pas avoir de booléens en C, alors je lui ai fait remarquer qu'on pouvait soit les définir soi-même, soit recourir au "bool" du C99. Et du tac au tac il m'a sorti "et comment tu fais pour afficher true et false !?"
(avec %s et ( x == true ? "true" : "false"), mais bon peut-être existe-t-il des spécificateurs de format pour les booléens, du coup ?)
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
O/1 est une division de 0 par 1 dont le résultat vaut 0 :-)
Le type booléen a une sémantique différente du type entier. Le problème de <stdbool.h> et du type _Bool (beurk) est de ne pas être utilisé par le langage C, ce qui rend leur intérêt uniquement décoratif, et sans beaucoup plus d'intérêt que 0 et 1. Par contre, avoir un vrai type booléen dans un langage a un intérêt. Dans un langage C hypothétique qui comprendrait ce type, les expressions suivantes seraient absurbes :
true + true true * false 1 && 1 0 || 1
Ça évite aussi des erreurs bêtes. En Java, par exemple, l'expression dans un if doit être de type booléen. Ainsi :
int a = 3; int b = 2;
if (a = b) { // Oups! = au lieu de = /* ... */ }
ne compile pas en Java, mais en C si.
A mon avis, l'absence d'un type booléen est une lacune du langage C.
-- Richard
Emmanuel Delahaye wrote:
In 'fr.comp.lang.c', gregg <greggory@netJUSTSAYNOcourrier.com> wrote:
Y a-t-il un spécificateur de format particulier pour les booléens ?
Un professeur de _java_ se plaignait de ce qu'on ne pouvait pas avoir de
booléens en C, alors je lui ai fait remarquer qu'on pouvait soit les
définir soi-même, soit recourir au "bool" du C99.
Et du tac au tac il m'a sorti "et comment tu fais pour afficher true et
false !?"
(avec %s et ( x == true ? "true" : "false"), mais bon peut-être
existe-t-il des spécificateurs de format pour les booléens, du coup ?)
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
O/1 est une division de 0 par 1 dont le résultat vaut 0 :-)
Le type booléen a une sémantique différente du type entier. Le problème
de <stdbool.h> et du type _Bool (beurk) est de ne pas être utilisé par
le langage C, ce qui rend leur intérêt uniquement décoratif, et sans
beaucoup plus d'intérêt que 0 et 1. Par contre, avoir un vrai type
booléen dans un langage a un intérêt. Dans un langage C hypothétique qui
comprendrait ce type, les expressions suivantes seraient absurbes :
true + true
true * false
1 && 1
0 || 1
Ça évite aussi des erreurs bêtes. En Java, par exemple, l'expression
dans un if doit être de type booléen. Ainsi :
int a = 3;
int b = 2;
if (a = b) { // Oups! = au lieu de = /* ... */
}
ne compile pas en Java, mais en C si.
A mon avis, l'absence d'un type booléen est une lacune du langage C.
Y a-t-il un spécificateur de format particulier pour les booléens ?
Un professeur de _java_ se plaignait de ce qu'on ne pouvait pas avoir de booléens en C, alors je lui ai fait remarquer qu'on pouvait soit les définir soi-même, soit recourir au "bool" du C99. Et du tac au tac il m'a sorti "et comment tu fais pour afficher true et false !?"
(avec %s et ( x == true ? "true" : "false"), mais bon peut-être existe-t-il des spécificateurs de format pour les booléens, du coup ?)
Ca sert à quoi les booléens? Qu'est-ce qui ne va pas avec 0/1...
O/1 est une division de 0 par 1 dont le résultat vaut 0 :-)
Le type booléen a une sémantique différente du type entier. Le problème de <stdbool.h> et du type _Bool (beurk) est de ne pas être utilisé par le langage C, ce qui rend leur intérêt uniquement décoratif, et sans beaucoup plus d'intérêt que 0 et 1. Par contre, avoir un vrai type booléen dans un langage a un intérêt. Dans un langage C hypothétique qui comprendrait ce type, les expressions suivantes seraient absurbes :
true + true true * false 1 && 1 0 || 1
Ça évite aussi des erreurs bêtes. En Java, par exemple, l'expression dans un if doit être de type booléen. Ainsi :
int a = 3; int b = 2;
if (a = b) { // Oups! = au lieu de = /* ... */ }
ne compile pas en Java, mais en C si.
A mon avis, l'absence d'un type booléen est une lacune du langage C.
-- Richard
Richard Delorme
gregg wrote:
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets...
Ce n'est pas une obligation. En C++, std::vector<bool> peut être spécialisé pour manipuler des tableaux de bits. Dans ce cas, avoir un vrai type booléen permet de gagner de la place en mémoire.
-- Richard
gregg wrote:
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour
utiliser deux valeurs on utilise au moins deux octets...
Ce n'est pas une obligation. En C++, std::vector<bool> peut être
spécialisé pour manipuler des tableaux de bits. Dans ce cas, avoir un
vrai type booléen permet de gagner de la place en mémoire.
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets...
Ce n'est pas une obligation. En C++, std::vector<bool> peut être spécialisé pour manipuler des tableaux de bits. Dans ce cas, avoir un vrai type booléen permet de gagner de la place en mémoire.
-- Richard
jz
A mon avis, l'absence d'un type booléen est une lacune du langage C.
Hou la la, en deux messages tu viens de transgresser deux tabous fondamentaux ici. Tu as écrit Ja**, et même C** ... n'entends-tu pas le doux bruissement des massues qui s'agitent aux fonds des cavernes :)
Sinon je suis d'accord avec toi, la sémantique d'un "et logique" n'a rien a voir avec celle d'un "et binaire", et pourtant en C on peut allégrement mélanger les deux sans que le compilateur ne s'émeuve.
Bien sûr ce n'est pas gênant pour qui a une grande expérience, mais j'aimerais bien savoir combien de nouveau programmes sont bugués chaque jour à cause de cela. C'est tellement vite fait d'écrire toto&titi au lieu de toto&&titi dans l'allégresse de l'écriture d'une fonction compliquée où l'on se concentre sur un algo tordu.
Que celui à qui cela n'est jamais arrivé me jette la première massue... non, pas la tête... c'est pas ma faute, c'est Richard qui a commencé :)
Jacques
A mon avis, l'absence d'un type booléen est une lacune du langage C.
Hou la la, en deux messages tu viens de transgresser deux tabous
fondamentaux ici. Tu as écrit Ja**, et même C** ... n'entends-tu pas le
doux bruissement des massues qui s'agitent aux fonds des cavernes :)
Sinon je suis d'accord avec toi, la sémantique d'un "et logique" n'a
rien a voir avec celle d'un "et binaire", et pourtant en C on peut
allégrement mélanger les deux sans que le compilateur ne s'émeuve.
Bien sûr ce n'est pas gênant pour qui a une grande expérience, mais
j'aimerais bien savoir combien de nouveau programmes sont bugués chaque
jour à cause de cela. C'est tellement vite fait d'écrire toto&titi au
lieu de toto&&titi dans l'allégresse de l'écriture d'une fonction
compliquée où l'on se concentre sur un algo tordu.
Que celui à qui cela n'est jamais arrivé me jette la première massue...
non, pas la tête... c'est pas ma faute, c'est Richard qui a commencé :)
A mon avis, l'absence d'un type booléen est une lacune du langage C.
Hou la la, en deux messages tu viens de transgresser deux tabous fondamentaux ici. Tu as écrit Ja**, et même C** ... n'entends-tu pas le doux bruissement des massues qui s'agitent aux fonds des cavernes :)
Sinon je suis d'accord avec toi, la sémantique d'un "et logique" n'a rien a voir avec celle d'un "et binaire", et pourtant en C on peut allégrement mélanger les deux sans que le compilateur ne s'émeuve.
Bien sûr ce n'est pas gênant pour qui a une grande expérience, mais j'aimerais bien savoir combien de nouveau programmes sont bugués chaque jour à cause de cela. C'est tellement vite fait d'écrire toto&titi au lieu de toto&&titi dans l'allégresse de l'écriture d'une fonction compliquée où l'on se concentre sur un algo tordu.
Que celui à qui cela n'est jamais arrivé me jette la première massue... non, pas la tête... c'est pas ma faute, c'est Richard qui a commencé :)
"Emmanuel Delahaye" a écrit dans le message de news:
Ca sert à quoi les booléens?
Posez la question à tous ceux qui ont conçu des langages où le type booléen existe :-))
-- -ed- [remove YOURBRA before answering me]
JCC
Pierre Maurette
"gregg" a écrit dans le message de news: 402528df$0$28126$
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens? En électricité, automatisme, électrotechnique, électronique (conception de
PLA par exemple), on peut être amené à manipuler exclusivement des booléens, dans un contexte d'algèbre du même nom. Et certainement dans de nombreux autres domaines. Sans parler de leur intérêt en programmation.
Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui font remarquer les incomparables avancées du langage machin sur le C m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false" comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me renseigner. Dans un cadre strictement polémique, vous pouvez répondre qu'afficher "true"
et "false" n'est qu'occasionnellement bénéfique. Les tables de vérité utilisent par exemple le plus souvent "1" et "0", parfois "V" et "F". Préférez-vous : Etat "arrêt d'urgence" : true (false) Etat "arrêt d'urgence" : 1 (0) Etat "arrêt d'urgence" : ON (OFF) Etat "arrêt d'urgence" : Actionné (Repos) Etat "arrêt d'urgence" : Enfoncé (Relâché) Etat "arrêt d'urgence" : X ( ) ou (-) ?
Il est peut-être bon ensuite d'arrêter de Paul & Mickey, sinon vous courrez le risque de vous faire moucher. AMHA, les types booléens sont calamiteux en C. Dire q'ils valent ceux de Java ou de Pascal procède de la même logique qu'un argumentaire politique. Le problème (qui concerne également C++) dépasse les types booléens, qu'ils existent ou pas. Les types entiers acceptant les opérateurs booléens (&&, ||, !) en sont eux-mêmes pollués, ce qui rend le problème irréversible. Attention, tout ça n'empêche pas le C de fonctionner. Votre exemple :
%s et ( x == true ? "true" : "false") affiche false pour x = 2.
Donc, au minimum faire : ( x != false ? "true" : "false") Le problème va plus loin, il est impossible de comparer fiablement des booléens, ce qui empêche de faire de l'algèbre de Boole. EtatLampe = (Inter1 == Inter2);/* pas fiable */ (XOR logique, interrupteur va et vient, ...) est plus agréable que :: EtatLampe = (Inter1 && Inter2) || (!Inter1 && !Inter2);
Que faire ? Soit en C s'en tenir aux int, et alors : (x != 0 ? "true" : "false") Soit, pour du code neuf, déclarer en bool ou _Bool et : (x ? "true" : "false") qui pour moi est envisageable si x est déclaré bool, _Bool, mais non int. D'ailleurs, dans ce cas je m'interdis (x != 0 ? ...). En fait, avec un certain nombre de règles de style, en particulier opérations booléennes sur booléens et opérations arithmétiques sur entiers, strictement, on peut se garantir des booléen toujours à 0 ou à 1. Donc, on peut faire des comparaisons de booléens : if(Contact1 == Contact2){/* */}
Quelqu'un connait-il un utilitaire genre lint qui vérifie ce genre de trucs quand le type bool existe ?
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets... C/C++ ne sont pas spécifiques sur ce point. En fait, ce n'est que rarement
un problème. On pourrait même regretter qu'ils ne soient pas systématiquement stockés dans des int, d'accès souvent plus efficaces que des char. Je me demande si, quand le type existe comme en C99 ou en C++, c'est ce que fait localement le compilateur en optimisation vitesse. Si l'on a d'immenses quantités de bool à traiter, il suffit d'écrire une paire de fonctions de compactage.
[HS]: Il existe des cartes sur lesquelles un "byte" correspond en réalité à un bit de poids faible variable complété par 7 bits à 0. Et même parfois la même adresse correspond à un bit en sortie en écriture et un bit en entrée indépendant en lecture. J'ai jamais manipulé ça en C. Le code suivant est-il à la norme (en considérant un type bool défini, sizeof(bool) = 1 :
#define AdressePort 128 ou const void* AdressePort = (void*)128;
"gregg" <greggory@netJUSTSAYNOcourrier.com> a écrit dans le message de news:
402528df$0$28126$636a15ce@news.free.fr...
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens?
En électricité, automatisme, électrotechnique, électronique (conception de
PLA par exemple), on peut être amené à manipuler exclusivement des booléens,
dans un contexte d'algèbre du même nom. Et certainement dans de nombreux
autres domaines.
Sans parler de leur intérêt en programmation.
Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui
font remarquer les incomparables avancées du langage machin sur le C
m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false"
comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me
renseigner.
Dans un cadre strictement polémique, vous pouvez répondre qu'afficher "true"
et "false" n'est qu'occasionnellement bénéfique. Les tables de vérité
utilisent par exemple le plus souvent "1" et "0", parfois "V" et "F".
Préférez-vous :
Etat "arrêt d'urgence" : true (false)
Etat "arrêt d'urgence" : 1 (0)
Etat "arrêt d'urgence" : ON (OFF)
Etat "arrêt d'urgence" : Actionné (Repos)
Etat "arrêt d'urgence" : Enfoncé (Relâché)
Etat "arrêt d'urgence" : X ( ) ou (-)
?
Il est peut-être bon ensuite d'arrêter de Paul & Mickey, sinon vous courrez
le risque de vous faire moucher.
AMHA, les types booléens sont calamiteux en C. Dire q'ils valent ceux de
Java ou de Pascal procède de la même logique qu'un argumentaire politique.
Le problème (qui concerne également C++) dépasse les types booléens, qu'ils
existent ou pas. Les types entiers acceptant les opérateurs booléens (&&,
||, !) en sont eux-mêmes pollués, ce qui rend le problème irréversible.
Attention, tout ça n'empêche pas le C de fonctionner.
Votre exemple :
%s et ( x == true ? "true" : "false")
affiche false pour x = 2.
Donc, au minimum faire :
( x != false ? "true" : "false")
Le problème va plus loin, il est impossible de comparer fiablement des
booléens, ce qui empêche de faire de l'algèbre de Boole.
EtatLampe = (Inter1 == Inter2);/* pas fiable */
(XOR logique, interrupteur va et vient, ...)
est plus agréable que ::
EtatLampe = (Inter1 && Inter2) || (!Inter1 && !Inter2);
Que faire ?
Soit en C s'en tenir aux int, et alors :
(x != 0 ? "true" : "false")
Soit, pour du code neuf, déclarer en bool ou _Bool et :
(x ? "true" : "false")
qui pour moi est envisageable si x est déclaré bool, _Bool, mais non int.
D'ailleurs, dans ce cas je m'interdis (x != 0 ? ...).
En fait, avec un certain nombre de règles de style, en particulier
opérations booléennes sur booléens et opérations arithmétiques sur entiers,
strictement, on peut se garantir des booléen toujours à 0 ou à 1. Donc, on
peut faire des comparaisons de booléens :
if(Contact1 == Contact2){/* */}
Quelqu'un connait-il un utilitaire genre lint qui vérifie ce genre de trucs
quand le type bool existe ?
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour
utiliser deux valeurs on utilise au moins deux octets...
C/C++ ne sont pas spécifiques sur ce point. En fait, ce n'est que rarement
un problème. On pourrait même regretter qu'ils ne soient pas
systématiquement stockés dans des int, d'accès souvent plus efficaces que
des char. Je me demande si, quand le type existe comme en C99 ou en C++,
c'est ce que fait localement le compilateur en optimisation vitesse.
Si l'on a d'immenses quantités de bool à traiter, il suffit d'écrire une
paire de fonctions de compactage.
[HS]:
Il existe des cartes sur lesquelles un "byte" correspond en réalité à un bit
de poids faible variable complété par 7 bits à 0. Et même parfois la même
adresse correspond à un bit en sortie en écriture et un bit en entrée
indépendant en lecture. J'ai jamais manipulé ça en C. Le code suivant
est-il à la norme (en considérant un type bool défini, sizeof(bool) = 1 :
#define AdressePort 128
ou
const void* AdressePort = (void*)128;
"gregg" a écrit dans le message de news: 402528df$0$28126$
Emmanuel Delahaye wrote:
Ca sert à quoi les booléens? En électricité, automatisme, électrotechnique, électronique (conception de
PLA par exemple), on peut être amené à manipuler exclusivement des booléens, dans un contexte d'algèbre du même nom. Et certainement dans de nombreux autres domaines. Sans parler de leur intérêt en programmation.
Qu'est-ce qui ne va pas avec 0/1...
à vrai dire avec les 0/reste_des_terminaux...
Bé, pour moi rien, mais c'est d'un point de vue polémique (les gens qui font remarquer les incomparables avancées du langage machin sur le C m'agacent un peu, je l'avoue).
Son argument du "ah oui, mais on peut pas afficher "true" ou "false" comme en Java", ça m'a plutôt laissé coi, alors je cherchais juste à me renseigner. Dans un cadre strictement polémique, vous pouvez répondre qu'afficher "true"
et "false" n'est qu'occasionnellement bénéfique. Les tables de vérité utilisent par exemple le plus souvent "1" et "0", parfois "V" et "F". Préférez-vous : Etat "arrêt d'urgence" : true (false) Etat "arrêt d'urgence" : 1 (0) Etat "arrêt d'urgence" : ON (OFF) Etat "arrêt d'urgence" : Actionné (Repos) Etat "arrêt d'urgence" : Enfoncé (Relâché) Etat "arrêt d'urgence" : X ( ) ou (-) ?
Il est peut-être bon ensuite d'arrêter de Paul & Mickey, sinon vous courrez le risque de vous faire moucher. AMHA, les types booléens sont calamiteux en C. Dire q'ils valent ceux de Java ou de Pascal procède de la même logique qu'un argumentaire politique. Le problème (qui concerne également C++) dépasse les types booléens, qu'ils existent ou pas. Les types entiers acceptant les opérateurs booléens (&&, ||, !) en sont eux-mêmes pollués, ce qui rend le problème irréversible. Attention, tout ça n'empêche pas le C de fonctionner. Votre exemple :
%s et ( x == true ? "true" : "false") affiche false pour x = 2.
Donc, au minimum faire : ( x != false ? "true" : "false") Le problème va plus loin, il est impossible de comparer fiablement des booléens, ce qui empêche de faire de l'algèbre de Boole. EtatLampe = (Inter1 == Inter2);/* pas fiable */ (XOR logique, interrupteur va et vient, ...) est plus agréable que :: EtatLampe = (Inter1 && Inter2) || (!Inter1 && !Inter2);
Que faire ? Soit en C s'en tenir aux int, et alors : (x != 0 ? "true" : "false") Soit, pour du code neuf, déclarer en bool ou _Bool et : (x ? "true" : "false") qui pour moi est envisageable si x est déclaré bool, _Bool, mais non int. D'ailleurs, dans ce cas je m'interdis (x != 0 ? ...). En fait, avec un certain nombre de règles de style, en particulier opérations booléennes sur booléens et opérations arithmétiques sur entiers, strictement, on peut se garantir des booléen toujours à 0 ou à 1. Donc, on peut faire des comparaisons de booléens : if(Contact1 == Contact2){/* */}
Quelqu'un connait-il un utilitaire genre lint qui vérifie ce genre de trucs quand le type bool existe ?
Je vois d'autant moins l'intérêt des booléens (stdbool.h) que pour utiliser deux valeurs on utilise au moins deux octets... C/C++ ne sont pas spécifiques sur ce point. En fait, ce n'est que rarement
un problème. On pourrait même regretter qu'ils ne soient pas systématiquement stockés dans des int, d'accès souvent plus efficaces que des char. Je me demande si, quand le type existe comme en C99 ou en C++, c'est ce que fait localement le compilateur en optimisation vitesse. Si l'on a d'immenses quantités de bool à traiter, il suffit d'écrire une paire de fonctions de compactage.
[HS]: Il existe des cartes sur lesquelles un "byte" correspond en réalité à un bit de poids faible variable complété par 7 bits à 0. Et même parfois la même adresse correspond à un bit en sortie en écriture et un bit en entrée indépendant en lecture. J'ai jamais manipulé ça en C. Le code suivant est-il à la norme (en considérant un type bool défini, sizeof(bool) = 1 :
#define AdressePort 128 ou const void* AdressePort = (void*)128;