C Language
Boolean
Zoeken…
Opmerkingen
Als u het vooraf gedefinieerde type _Bool
en de kop <stdbool.h>
, moet u de C99 / C11-versies van C gebruiken.
Om compilerwaarschuwingen en mogelijk fouten te voorkomen, moet u het typedef
/ define
voorbeeld alleen gebruiken als u C89 en eerdere versies van de taal gebruikt.
Stdbool.h gebruiken
Met behulp van het systeemkopbestand stdbool.h
kunt u bool
als een Boolean-gegevenstype. true
resulteert in 1
en false
in 0
.
#include <stdio.h>
#include <stdbool.h>
int main(void) {
bool x = true; /* equivalent to bool x = 1; */
bool y = false; /* equivalent to bool y = 0; */
if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
{
puts("This will print!");
}
if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
{
puts("This will also print!");
}
}
bool
is gewoon een leuke spelling voor het gegevenstype _Bool
. Het heeft speciale regels wanneer getallen of verwijzingen ernaar worden geconverteerd.
#Define gebruiken
C van alle versies, zal effectief elke gehele waarde anders dan 0
als true
voor vergelijkingsoperatoren en de gehele waarde 0
als false
. Als u niet beschikt over _Bool
of bool
als van C99 beschikbaar is, kunt u een Boolean data type in C simuleren met behulp van #define
macro's, en je zou nog steeds zulke dingen in legacy code te vinden.
#include <stdio.h>
#define bool int
#define true 1
#define false 0
int main(void) {
bool x = true; /* Equivalent to int x = 1; */
bool y = false; /* Equivalent to int y = 0; */
if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
{
puts("This will print!");
}
if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
{
puts("This will also print!");
}
}
Voer dit niet in nieuwe code in, omdat de definitie van deze macro's kan botsen met modern gebruik van <stdbool.h>
.
Gebruik van het intrinsieke (ingebouwde) type _Bool
_Bool
is toegevoegd in de C-standaardversie C99 en is ook een native C-gegevenstype. Het kan de waarden 0
(voor onwaar ) en 1
(voor waar ) bevatten.
#include <stdio.h>
int main(void) {
_Bool x = 1;
_Bool y = 0;
if(x) /* Equivalent to if (x == 1) */
{
puts("This will print!");
}
if (!y) /* Equivalent to if (y == 0) */
{
puts("This will also print!");
}
}
_Bool
is een geheel getal, maar heeft speciale regels voor conversies van andere typen. Het resultaat is analoog aan het gebruik van andere typen in if
expressies . In de volgende
_Bool z = X;
- Als
X
een rekenkundig type heeft (is een willekeurig getal), wordtz
0
alsX == 0
. Anders wordtz
1
. - Als
X
een pointertype heeft, wordtz
0
alsX
een nulwijzer is en anders1
.
Om mooiere spelling bool
, false
en true
te gebruiken, moet je <stdbool.h>
.
Gehele getallen en verwijzingen in Booleaanse uitdrukkingen.
Alle gehele getallen of verwijzingen kunnen worden gebruikt in een uitdrukking die wordt geïnterpreteerd als "waarheidswaarde".
int main(int argc, char* argv[]) {
if (argc % 4) {
puts("arguments number is not divisible by 4");
} else {
puts("argument number is divisible by 4");
}
...
De uitdrukking argc % 4
wordt geëvalueerd en leidt tot een van de waarden 0
, 1
, 2
of 3
. De eerste, 0
is de enige waarde die "false" is en brengt uitvoering in het else
deel. Alle andere waarden zijn "waar" en gaan in het if
gedeelte.
double* A = malloc(n*sizeof *A);
if (!A) {
perror("allocation problems");
exit(EXIT_FAILURE);
}
Hier wordt de aanwijzer A
geëvalueerd en als het een nulaanwijzer is, wordt een fout gedetecteerd en wordt het programma afgesloten.
Veel mensen schrijven liever iets als A == NULL
, maar als u dergelijke vergelijkingen van aanwijzers hebt als onderdeel van andere gecompliceerde uitdrukkingen, worden dingen snel moeilijk te lezen.
char const* s = ....; /* some pointer that we receive */
if (s != NULL && s[0] != '\0' && isalpha(s[0])) {
printf("this starts well, %c is alphabetic\n", s[0]);
}
Om dit te controleren, moet u een gecompliceerde code in de uitdrukking scannen en zeker zijn van de voorkeur van de operator.
char const* s = ....; /* some pointer that we receive */
if (s && s[0] && isalpha(s[0])) {
printf("this starts well, %c is alphabetic\n", s[0]);
}
is relatief eenvoudig vast te leggen: als de aanwijzer geldig is, controleren we of het eerste teken niet nul is en controleren we of het een letter is.
Een bool-type definiëren met typedef
Aangezien de meeste debuggers niet op de hoogte zijn van #define
macro's, maar enum
constanten kunnen controleren, kan het wenselijk zijn om zoiets te doen:
#if __STDC_VERSION__ < 199900L
typedef enum { false, true } bool;
/* Modern C code might expect these to be macros. */
# ifndef bool
# define bool bool
# endif
# ifndef true
# define true true
# endif
# ifndef false
# define false false
# endif
#else
# include <stdbool.h>
#endif
/* Somewhere later in the code ... */
bool b = true;
Hierdoor kunnen compilers voor historische versies van C werken, maar blijven ze compatibel als de code wordt gecompileerd met een moderne C-compiler.
Voor meer informatie over typedef
, zie typedef , voor meer informatie over enum
zien Opsommingen