C heeft geen ingebouwde booleaanse typen. Wat is de beste manier om ze in C te gebruiken?
Antwoord 1, autoriteit 100%
Van goed tot slecht:
Optie 1 (C99 en nieuwer)
#include <stdbool.h>
Optie 2
typedef enum { false, true } bool;
Optie 3
typedef int bool;
enum { false, true };
Optie 4
typedef int bool;
#define true 1
#define false 0
#Uitleg
- Optie 1 werkt alleen als je C99 (of nieuwer) gebruikt en het is de “standaardmanier” om dit te doen. Kies dit indien mogelijk.
- Opties 2, 3 en 4 zullen in de praktijk hetzelfde identieke gedrag vertonen. #2 en #3 gebruiken #defines echter niet, wat naar mijn mening beter is.
Als je twijfelt, ga dan voor nummer 1!
Antwoord 2, autoriteit 22%
Een paar gedachten over booleans in C:
Ik ben oud genoeg om gewoon int
s als mijn boolean-type te gebruiken zonder typedefs of speciale definities of opsommingen voor waar/onwaar-waarden. Als je mijn suggestie hieronder volgt om nooit te vergelijken met booleaanse constanten, dan hoef je alleen 0/1 te gebruiken om de vlaggen toch te initialiseren. Een dergelijke benadering kan in deze moderne tijd echter als te reactionair worden beschouwd. In dat geval moet je zeker <stdbool.h>
gebruiken omdat het op zijn minst het voordeel heeft dat het gestandaardiseerd is.
Hoe de booleaanse constanten ook worden genoemd, gebruik ze alleen voor initialisatie. Schrijf nooit iets als
if (ready == TRUE) ...
while (empty == FALSE) ...
Deze kunnen altijd worden vervangen door de duidelijkere
if (ready) ...
while (!empty) ...
Merk op dat deze redelijk en begrijpelijkerwijs hardop kunnen worden uitgelezen.
Geef uw Booleaanse variabelen positieve namen, dwz full
in plaats van notfull
. De laatste leidt tot code die moeilijk te lezen is. Vergelijk
if (full) ...
if (!full) ...
met
if (!notfull) ...
if (notfull) ...
Beide van het voormalige paar lezen van nature, terwijl !notfull
is ongemakkelijk om te lezen, zelfs als het is, en wordt veel slechter in meer complexe Booleaanse uitdrukkingen.
Booleaanse argumenten moeten over het algemeen worden vermeden. Overweeg een functie die is gedefinieerd
void foo(bool option) { ... }
In het lichaam van de functie is het heel duidelijk wat het argument betekent omdat het een handig en hopelijk zinvolle, naam heeft. Maar de oproepsites zien eruit als
foo(TRUE);
foo(FALSE):
Hier is het in wezen onmogelijk om te vertellen wat de parameter bedoeld is zonder altijd te kijken naar de functie-definitie of -verklaring, en het wordt veel erger als u nog meer Booleaanse parameters toevoegt. Ik stel voor
typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);
of
#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }
In beide gevallen lijkt de oproepsite nu op
foo(OPT_ON);
foo(OPT_OFF);
Welke de lezer heeft op zijn minst een kans op begrip zonder de definitie van foo
te vergroten.
Antwoord 3, Autoriteit 8%
Een Boolean in C is een geheel getal: nul voor false en niet-nul voor waar.
Zie ook Boolean gegevenstype , Sectie C, C++, Objective-C, AWK .
Antwoord 4, Autoriteit 7%
Hier is de versie die ik heb gebruikt:
typedef enum { false = 0, true = !false } bool;
Omdat onjuist één waarde heeft, maar een logisch true zou veel waarden kunnen hebben, maar techniek gaat trouw aan om te zijn wat de compiler voor het tegenovergestelde van false zal gebruiken.
Dit zorgt voor het probleem van iemand die iets is dat hierop zou komen:
if (true == !false)
Ik denk dat we het er allemaal mee eens zijn dat dat geen goede praktijk is, maar voor de ene keer kosten van het doen van “True =! False”, elimineren we dat probleem.
[bewerken] Uiteindelijk gebruikte ik:
typedef enum { myfalse = 0, mytrue = !myfalse } mybool;
Om een naambotsing te voorkomen met andere regelingen die true
en false
. Maar het concept blijft hetzelfde.
[bewerken] om conversie van integer naar Boolean te tonen:
mybool somebool;
int someint = 5;
somebool = !!someint;
De eerste (meest rechtse) ! converteert het gehele getal dat niet nul is naar een 0, dan de tweede (meest linkse) ! converteert de 0 naar een myfalse
waarde. Ik laat het als een oefening voor de lezer om een geheel getal nul om te zetten.
[BEWERKEN]
Het is mijn stijl om de expliciete instelling van een waarde in een opsomming te gebruiken wanneer de specifieke waarde vereist is, zelfs als de standaardwaarde hetzelfde zou zijn. Voorbeeld: Omdat false nul moet zijn, gebruik ik false = 0,
in plaats van false,
Antwoord 5, autoriteit 4%
Als u een C99-compiler gebruikt, heeft deze ingebouwde ondersteuning voor bool-typen:
#include <stdbool.h>
int main()
{
bool b = false;
b = true;
}
http://en.wikipedia. org/wiki/Boolean_data_type
Antwoord 6, autoriteit 3%
Eerst eerst. C, d.w.z. ISO/IEC 9899 heeft al 19 jaareen boolean-type. Dat is veel langer dan de verwachtelengte van de C-programmeercarrière met amateur-/academische/professionele onderdelen gecombineerd bij het bezoeken van deze vraag. De mijne overtreft dat met slechts 1-2 jaar. Het betekent dat gedurende de tijd dat een gemiddelde lezer ook maar iets over C heeft geleerd, C eigenlijk het booleaanse gegevenstype heeft gehad.
Voor het datatype #include <stdbool.h>
, en gebruik true
, false
en bool
. Of voeg het niet toe en gebruik in plaats daarvan _Bool
, 1
en 0
.
Er worden verschillende gevaarlijkepraktijken gepromoot in de andere antwoorden op deze thread. Ik zal ze aanspreken:
typedef int bool;
#define true 1
#define false 0
Dit is nee-nee, omdat een toevallige lezer – die C in die 19 jaar heeft geleerd – zou verwachten dat bool
verwijst naar de feitelijkebool
gegevenstype en zou zich op dezelfde manier gedragen, maar dat doet het niet! Bijvoorbeeld
double a = ...;
bool b = a;
Met C99 bool
/ _Bool
, zou b
worden ingesteld op false
iffa
was nul, en anders true
. C11 6.3.1.2p1
- Als een scalaire waarde wordt geconverteerd naar
_Bool
, is het resultaat 0 als de waarde gelijk is aan 0; anders is het resultaat 1. 59)Voetnoten
59) NaN’s zijn niet gelijk aan 0 en worden dus omgezet in 1.
Met de typedef
op zijn plaats, zou de double
worden gedwongen tot een int
– als de waarde van de double niet in de bereik voor int
, het gedrag is niet gedefinieerd.
Natuurlijk geldt hetzelfde als true
en false
zijn gedeclareerd in een enum
.
Wat nog gevaarlijkeris, is verklaren
typedef enum bool {
false, true
} bool;
omdat nu alle waardenbehalve 1 en 0 ongeldig zijn, en als een dergelijke waarde zou worden toegewezen aan een variabele van dat type, het gedrag zou volledig ongedefinieerd zijn.
Daarom iffkun je C99 om een onverklaarbare reden niet gebruiken, voor booleaanse variabelen moet je het volgende gebruiken:
- typ
int
en waarden0
en1
as-is; en voer zorgvuldig domeinconversies uit van andere waarden naar deze met dubbele ontkenning!!
- of als je aandringtdat je niet meer weet dat 0 vals is en niet gelijk is aan nul, gebruik dan in ieder geval hoofdletterszodat ze niet verward worden met de C99-concepten:
bool
,true
enfalse
!
Antwoord 7
typedef enum {
false = 0,
true
} t_bool;
Antwoord 8
C heeft een boolean type: bool(tenminste voor de laatste 10(!) jaar)
Inclusief stdbool.h en true/false werkt zoals verwacht.
Antwoord 9
Alles wat niet nul is, wordt geëvalueerd als waar in booleaanse bewerkingen, dus u kunt gewoon
#define TRUE 1
#define FALSE 0
en gebruik de constanten.
Antwoord 10
Gewoon een aanvulling op andere antwoorden en enige verduidelijking, als u C99 mag gebruiken.
+-------+----------------+-------------------------+--------------------+
| Name | Characteristic | Dependence in stdbool.h | Value |
+-------+----------------+-------------------------+--------------------+
| _Bool | Native type | Don't need header | |
+-------+----------------+-------------------------+--------------------+
| bool | Macro | Yes | Translate to _Bool |
+-------+----------------+-------------------------+--------------------+
| true | Macro | Yes | Translate to 1 |
+-------+----------------+-------------------------+--------------------+
| false | Macro | Yes | Translate to 0 |
+-------+----------------+-------------------------+--------------------+
Enkele van mijn voorkeuren:
_Bool
ofbool
? Beide zijn prima, maarbool
ziet er beter uit dan het zoekwoord_Bool
.- Geaccepteerde waarden voor
bool
en_Bool
zijn:false
oftrue
. Het toewijzen van0
of1
in plaats vanfalse
oftrue
is geldig, maar is moeilijker te lezen en te begrijpen van de logische stroom .
Enkele informatie uit de standaard:
_Bool
is NIETunsigned int
, maar maakt deel uit van de groep unsigned integer types. Het is groot genoeg om de waarden0
of1
te bevatten.- NIET DOEN, maar ja, je kunt
bool
true
enfalse
opnieuw definiëren, maar het is zeker geen goed idee. Deze mogelijkheid wordt als verouderd beschouwd en zal in de toekomst worden verwijderd. - Een scalair type(rekenkundige typen en aanwijzertypes) toewijzen aan
_Bool
ofbool
, als de scalarwaarde is gelijk aan0
of is vergelijkbaar met0
het zal0
zijn, anders is het resultaat1
:_Bool x = 9;
9
wordt geconverteerd naar1
wanneer toegewezen aanx
. _Bool
is 1 byte (8 bits), meestal komt de programmeur in de verleiding om de andere bits te gebruiken, maar dit wordt niet aanbevolen, omdat de enige garantie die wordt gegeven is dat er maar één bit is gebruik om gegevens op te slaan, niet zoals typechar
dat 8 bits beschikbaar heeft.
Antwoord 11
Tegenwoordig ondersteunt C99booleaanse typen, maar je moet #include <stdbool.h>
.
Voorbeeld:
#include <stdbool.h>
int main()
{
bool arr[2] = {true, false};
printf("%d\n", arr[0] && arr[1]);
printf("%d\n", arr[0] || arr[1]);
return 0;
}
Uitvoer:
0
1
Antwoord 12
Het is dit:
#define TRUE 1
#define FALSE 0
Antwoord 13
Je kunt er een char of een andere container met een klein getal voor gebruiken.
Pseudo-code
#define TRUE 1
#define FALSE 0
char bValue = TRUE;
Antwoord 14
Je zou _Bool kunnen gebruiken, maar de geretourneerde waarde moet een geheel getal zijn (1 voor waar, 0 voor onwaar).
Het wordt echter aanbevolen om bool op te nemen en te gebruiken zoals in C++, zoals gezegd in
dit antwoordvan daniweb forum, evenals dit antwoord, van deze andere stackoverflow-vraag:
_bool: C99’s Boolean-type. Het gebruik van _Bool rechtstreeks wordt aanbevolen als u Legacy-code behoudt die al macros voor BOOL, TRUE of FALSE definieert. Anders zijn die macro’s gestandaardiseerd in de kop. Voeg die kop toe en je kunt Bool gebruiken, net zoals jij in C++.
Antwoord 15
Voorwaardelijke uitdrukkingen worden geacht waar te zijn als ze niet-nul zijn, maar de C-standaard vereist dat logische operatoren zelf 0 of 1 terugkeren.
@tom: #define true! false is slecht en is volledig zinloos. Als het koptekstbestand zijn weg doet naar de gecompileerde C++ -code, kan het leiden tot problemen:
void foo(bool flag);
...
int flag = TRUE;
foo(flag);
Sommige compilers genereren een waarschuwing over de INT = & GT; Bool-conversie. Soms vermijden mensen dit door:
foo(flag == TRUE);
Om de uitdrukking te dwingen een C++ BOOL te zijn. Maar als je #define true! FALSE, je eindigt met:
foo(flag == !0);
die uiteindelijk een int-to-boolvergelijking doet die de waarschuwing toch kan veroorzaken.
Antwoord 16
Als u C99 gebruikt, kunt u de _Bool
type gebruiken. NEE #include
S zijn noodzakelijk. Je moet het wel als een geheel getal behandelen, waar het 1
true
en 0
is false
.
U kunt dan TRUE
en FALSE
definiëren.
_Bool this_is_a_Boolean_var = 1;
//or using it with true and false
#define TRUE 1
#define FALSE 0
_Bool var = TRUE;
Antwoord 17
Dit is wat ik gebruik:
enum {false, true};
typedef _Bool bool;
_Bool
is een ingebouwd type in C. Het is bedoeld voor booleaanse waarden.
Antwoord 18
U kunt de instructie #define
eenvoudig als volgt gebruiken:
#define TRUE 1
#define FALSE 0
#define NOT(arg) (arg == TRUE)? FALSE : TRUE
typedef int bool;
En gebruik als volgt:
bool isVisible = FALSE;
bool isWorking = TRUE;
isVisible = NOT(isVisible);
en ga zo maar door