Qu'est-ce que bool en C/C++? Un mot-clé ou une macro?
J'ai évoqué cette question, dans lequel certaines des réponses suggèrent que bool
est un type intégral (IDEs aussi le traiter comme un mot clé).
Cependant, aucune de ces réponses suggèrent l'information fournie dans le cplusplus, qui dit que bool
est une macro qui est ajouté par <cstdbool>
(Dans ce cas, les compilateurs peuvent être implicitement l'ajout de cet en-tête lors de la compilation pour permettre bool
). Ici, c'est le g++ version de <stdbool.h>
.
Qu'est-ce exactement le bool
est? Une partie intégrante de type mot-clé ou une macro?
C ou C++? Choisissez-en un s'il vous plaît.
rien de mal à vouloir connaître la réponse dans les deux langues
Je suggère de poser deux questions, dans ce cas.
Poser 2 questions avec le même contenu, mais "C" et "C++" de cordes, de ridicule et de ne pas ajouter de la valeur. Pourquoi êtes-vous pédant?
Ce n'est pas pédantisme; ce sont deux langues distinctes avec des règles distinctes (comme les réponses à expliquer), et nous n'avons pas forfaitaire de multiples questions sur différents sujets dans le même post sur LE! Ou doit-on aussi se demander comment les booléens travail en PHP, JavaScript, Perl...
rien de mal à vouloir connaître la réponse dans les deux langues
Je suggère de poser deux questions, dans ce cas.
Poser 2 questions avec le même contenu, mais "C" et "C++" de cordes, de ridicule et de ne pas ajouter de la valeur. Pourquoi êtes-vous pédant?
Ce n'est pas pédantisme; ce sont deux langues distinctes avec des règles distinctes (comme les réponses à expliquer), et nous n'avons pas forfaitaire de multiples questions sur différents sujets dans le même post sur LE! Ou doit-on aussi se demander comment les booléens travail en PHP, JavaScript, Perl...
OriginalL'auteur iammilind | 2013-08-04
Vous devez vous connecter pour publier un commentaire.
En C,
bool
est une macro.Il n'est pas intégré dans le type de mot clé ou par le nom de
bool
en C, si typique des implémentations de l'utilisation de la bibliothèque standard de#define
true
etfalse
à1
et0
respectivement. Des règles telles que celles pour laif
déclaration sont définis en termes de "zéro" et "non-zéro" expressions, et s'appuient donc sur l'étendue des définitions de macros detrue
etfalse
:Pour des raisons de commodité, C99 ajouté intégré de type intermédiaire
_Bool
, et les implémentations de cette langue généralement#define
bool
à_Bool
. Ce type est défini ainsi:Cela permet une plus grande compatibilité avec les programmes C++, qui peuvent inclure des déclarations de fonctions à l'aide de la
bool
type; vraiment, même si,#define _Bool int
aurait probablement suffi.En C++,
bool
est à la fois un type et d'un mot clé.Le lien que vous avez fourni ne veut pas dire que
bool
est une macro en C++. Il dit:Et c'est correct.
Sémantiquement (qui est, en termes de "sens" de votre code),
[C++11: 3.9.1/2]
définitbool
tant que partie intégrante de type en C++.Lexicalement (qui est, en termes de "apparence" dans votre code),
[C++11: 2.12/1]
répertorie en tant que mot-clé. En fait, tous jetons d'une partie des noms de types intégraux sont également des mots-clés, y compris (mais non limité à):int
unsigned
long
bool
short
signed
Il est, cependant, jamais une macro en C++. Au lieu de cela, vous obtenez une macro
__bool_true_false_are_defined
que vous pourriez utiliser en multi-langue code pour changer le traitement debool
selon que vous travaillez en C ou C++, je ne suis pas sûr que je peux penser à un exemple utile, vous l'esprit.En C++, bool est une macro définie bool (mot-clé). le faux est défini à false et true est définie sur true. Qui s'en soucie ? Moi parce que mon IDE couleurs bool comme une macro au lieu d'un mot-clé à cause de ça... (et c'est moche) La seule façon que je peux accéder au réel de types en utilisant #undef
Ce n'est pas vrai; code/library/en-tête/de la mise en œuvre est en train de faire. Un programme qui ne
#define bool bool
ou#define true true
ou#define false false
, en réalité, a un comportement indéterminé (mais je peux à peu près imaginer une merde stdlib mise en œuvre de le faire), donc c'est certainement pas quelque chose à propos de "en C++"Il est fait en stdbool.h et il est indiqué "le Soutien de <stdbool.h> en C++ est un GCC extension". Je n'ai pas quelque chose de bizarre avec ma configuration, à l'aide de gcc 4.9.2 sur debian.
Bon, alors, un en-tête C inclus seulement comme une extension de votre stdlib mise en œuvre. Rien à voir avec le C++. Suffit de ne pas utiliser l'en-tête et vous serez amende.
OriginalL'auteur Lightness Races in Orbit
En C
bool
est une macro à partir d'stdbool.h
qui se développe à_Bool
qui est le C de type booléen._Bool
est numérique, qui peut ne pas être ce que l'on attend de venir à partir de C++. Vraiment,_Bool
n'est pas un "type booléen"; c'est simplement un type numérique assez grand pour stocker à la fois1
et0
.Je respecte la terminologie C qui appelle
_Bool
le type booléen dans le C Standard.6.1.3.2 est dirigé "de type Booléen", mais ne parle que de conversions:
When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.
C'est une sorte de faux-type booléen, par toute la logique classique.c'est la raison pour laquelle il est appelé le type booléen. C'est un type entier, mais les conversions ne se comportent pas comme d'autres types d'entiers. Par exemple,
(bool) 0.5
est1
, mais(char) 0.5
ou(int) 0.5
sont0
. Le terme de type booléen est également évoqué dans 7.18 type Booléen et les valeurs de <stdbool.h> dans la Norme.OriginalL'auteur ouah
En C++, il est appelé littéral Booléen, il est construit dans le type.
§2.14.7
Types bool, char, char16_t, char32_t, wchar_t, et les entiers signés et non signés types d'entiers sont collectivement appelés les types intégraux.
§2.14.6
Littéraux booléens
Les littéraux Booléens sont les mots-clés faux et vrai. Ces littéraux sont prvalues et avoir le type bool.
§ 3.9.1.6
OriginalL'auteur billz
En C++
bool
agit d'un type de données. En C, il n'est pas, donc si vous êtes en utilisantbool
en C, il a été mis en œuvre comme une définition de type ou avec#define
, ettrue
etfalse
doit avoir été mis en œuvre avec#define
ou peut-être sont des constantes.OriginalL'auteur Codie CodeMonkey
En C il n'y a pas de notion comme des variables Booléennes, Oui un langage de haut niveau comme Java, C# et autres nous donne la facilité de déclarer une variable Booléenne, que nous utilisons aux fins de repérage pour définir ce soit vrai ou faux.
Mais vous pouvez mettre en œuvre ce à l'aide d'intégrales comme nous l'avons fait en C
_Bool
, et les constantes littéralestrue
etfalse
sont définies dans un en-tête. Et alors qu'en C, les opérateurs de comparaison officiellement résultat dans unint
, le langage est conçu de sorte que vous pouvez programmer en elle comme si elle a un vrai type booléen; cela a été plus ou moins pratique recommandée pour les moins de 30 ans.Il a vraiment m'a étonné, Merci James, je n'ai jamais su.
Si quelqu'un a des doutes sur des variables booléennes dans C visitez - stackoverflow.com/questions/1921539/using-boolean-values-in-c Cela signifie seulement que vous ne pouvez pas le faire directement une variable boolean, vous avez besoin de la définir à l'aide de mot-clé typedef , Donc la réponse est à la Fois parce que l'on peut la définir à l'aide de #define vrai et dans d'autres langues, c'est aussi un mot-clé.
Avez-vous lu la réponse. Si vous incluez
<stdbool.h>
, vous pouvez utiliserbool
,true
etfalse
exactement comme vous le feriez en C++. Officiellement, ils sont différents, mais lorsqu'il est utilisé normalement, les différences n'ont pas d'impact sur votre code.Oui je l'ai fait, Merci James
OriginalL'auteur Đēēpak
En C
_Bool
est un type etbool
,true
etfalse
sont des macros définies dansstdbool.h
ISO C11 standard unis (dans la section 6.2.5 Types )
stdbool.h
définit 4 macros.bool
qui se développe pour_Bool
true
qui se développe pour1
false
qui se développe pour0
__bool_true_false_are_defined
qui se développe pour1
.OriginalL'auteur ShuklaSannidhya