die true en false in C

Voor zover ik kan zien zijn er 3 manieren om Booleans in C

te gebruiken

  1. met het BOOL-type, vanaf dat moment met behulp van True and False
  2. definiëren met behulp van preprocessor #define FALSE 0 ... #define TRUE !(FALSE)
  3. Gewoon om constanten rechtstreeks te gebruiken, d.w.z. 1 en 0

Zijn er andere methoden die ik heb gemist? Wat zijn de voor- en nadelen van de verschillende methoden?

Ik veronderstel dat het snelste nummer 3 zou zijn, 2 is nog gemakkelijk leesbaar (hoewel bitwise-ontkenning enigszins voegt toe aan overhead), is 1 het meest leesbaar, niet compatibel met alle compilers.


1, Autoriteit 100%

Neem gewoon op <stdbool.h>als uw systeem het biedt. Dat definieert een aantal macro’s, waaronder bool, false, EN true(gedefinieerd met _Bool, 0, EN 1 respectievelijk). Zie paragraaf 7.16 van C99 voor meer informatie.


2, Autoriteit 18%

Gebruik gewoon 0 of 1 rechtstreeks in de code.

Voor C-programmeurs is dit net zo intuïtief als waar of onwaar.


3, Autoriteit 15%

Ik doe meestal een:

typedef enum {FALSE = 0, TRUE} boolean;

4, Autoriteit 4%

Met het StdBool.H-gedefinieerde Bool-type ontstaan ​​problemen wanneer u code van een nieuwere compiler moet verplaatsen die het Bool-type ondersteunt aan een oudere compiler. Dit kan gebeuren in een ingebouwde programmeeromgeving wanneer u naar een nieuwe architectuur gaat met een C-compiler op basis van een oudere versie van de specificatie.

In sommatie zou ik bij de macro’s blijven wanneer draagbaarheid aangelond. Doe anders wat anderen aanbevelen en gebruik de Bulit in het type.


5, Autoriteit 4%

Aan welke van de drie u gaat, vergelijk uw variabelen tegen false of onwaar.

Historisch gezien is het een slecht idee om alles te vergelijken naar true (1) in C of C++. Alleen false is gegarandeerd nul (0). Waar is elke andere waarde .
& nbsp;
Veel compilerverkopers hebben deze definities ergens in hun headers.
& nbsp;

#define TRUE 1
#define FALSE 0

Dit heeft te veel mensen in het tuinpad geleid.
& nbsp;
Veel bibliotheekfuncties behalve chartypeRetournetten Nonzero-waarden niet gelijk aan 1over succes. Er is veel Legacy-code die er met hetzelfde gedrag is.


6, Autoriteit 2%

u kunt testen of bool is gedefinieerd in C95 STDBOOL.H met

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif

7, Autoriteit 2%

Ik zou voor 1 gaan 1. Ik heb er geen incompatibiliteit mee ontmoet en is natuurlijker. Maar ik denk dat het een deel is van C++ niet C-standaard.
Ik denk dat met vuile hacking met definieën of je derde optie – geen prestaties oplevert, maar alleen pijn die de code behoudt.


8, Autoriteit 2%

Ik geef de voorkeur (1) Wanneer ik een variabele definieer, maar in uitdrukkingen heb ik nooit vergelijkbaar met True and False, neem dan gewoon de impliciete C-definitie van IF (Flag) of of (PTR). Dat is de c-manier om dingen te doen.


9, Autoriteit 2%

Elke int andere dan nul is waar; false is nul. Die manier waarop code zo is, blijft werken zoals verwacht:

int done = 0;   // `int` could be `bool` just as well
while (!done)
{
     // ...
     done = OS_SUCCESS_CODE == some_system_call ();
}

IMO, boolis een overschatte type, misschien een overdracht van andere talen. intWerkt prima als een Boolean-type.


10

Ik gebruikte de #define omdat ze code gemakkelijker maken om te lezen, en er zou geen uitvoeringen moeten zijn in vergelijking met het gebruik van nummers (0,1) COZ ‘De preprocessor converteert de #define in getallen vóór compilatie. Zodra de aanvraag wordt uitgevoerd, komt PreProcessor niet weer in de weg omdat de code al is opgesteld.

BTW het zou moeten zijn:

#define FALSE 0 
#define TRUE 1

Onthoud dat -1, -2, … 2, 3, etc. alle evalueert naar True.


11

Ik ken je geen specifieke situatie. Terug toen ik C-programma’s aan het schrijven was, hebben we altijd # 2 gebruikt.

#define FALSE = 0
#define TRUE = !FALSE

Dit kan anders zijn onder buitenaardse platform aan DOS- of Intel-processors. Maar ik gebruikte beide C als ASM samen met het schrijven van grafische bibliotheken en grafische IDE. Ik was een echte fan van micheal abrash en was van plan om te leren over textuurmapping en zo. In ieder geval! Dat is niet het onderwerp van de vraag hier!

Dit was het meest gebruikte formulier om Booleaanse waarden in C te definiëren, omdat deze headfile stdbool.h toen niet bestond.


12

Er is geen real-snelheidsverschil. Ze zijn echt allemaal hetzelfde voor de compiler. Het verschil is bij de menselijke wezens die proberen om uw code te gebruiken en te lezen.

Voor mij die bool, true en valse de beste keuze in C++ -code maakt. In C-code zijn er enkele compilers rond die geen steun ondersteunen (ik moet vaak met oude systemen werken), dus ik zou in sommige omstandigheden met de definities kunnen gaan.


13

Ik geef de voorkeur aan de derde oplossing, d.w.z. met behulp van 1 en 0, omdat het bijzonder handig is wanneer u moet testen of een voorwaarde waar of onwaar is: u kunt eenvoudig een variabele gebruiken voor het IF-argument.
Als u andere methoden gebruikt, denk ik dat, om in overeenstemming te zijn met de rest van de code, ik een test als deze zou moeten gebruiken:

if (variable == TRUE)
{
   ...
}

In plaats van:

if (variable)
{
   ...
}

14

Ik gebruik het liefst

#define FALSE (0!=0) 
#define TRUE  (0==0)

of rechtstreeks in de code

if (flag == (0==0)) { ... }

De compiler zal daar voor zorgen. Ik gebruik veel talen en moet je herinneren dat false 0 stoorts me veel is; Maar als ik moet, denk ik meestal aan die snaarlus

do { ... } while (*ptr);

en daardoor zie ik dat ONWAAR 0 is

Other episodes