How to use boolean datatype in C?
Asked Answered
N

7

49

I was just writing code in C and it turns out it doesn't have a boolean/bool datatype. Is there any C library which I can include to give me the ability to return a boolean/bool datatype?

Nephralgia answered 11/11, 2010 at 22:4 Comment(2)
Usually a plain old 'int' is used, with the assumption that 0 is 'false' and anything else is 'true'.Dud
Possible duplicate of Is bool a native C type?Franconia
B
76

If you have a compiler that supports C99 you can

#include <stdbool.h>

Otherwise, you can define your own if you'd like. Depending on how you want to use it (and whether you want to be able to compile your code as C++), your implementation could be as simple as:

#define bool int
#define true 1
#define false 0

In my opinion, though, you may as well just use int and use zero to mean false and nonzero to mean true. That's how it's usually done in C.

Bandy answered 11/11, 2010 at 22:5 Comment(5)
@James, it worked. But what i should return? i mean 0 or false?Nephralgia
@ysap: I picked macros because it's closer to what C99 does (In C99, true and false are both macros that are replaced by 1 and 0, respectively, and bool is a macro that expands to the boolean type, _Bool.Bandy
@its: If you define macros for bool, true, and false, then make your return type bool and return false. Otherwise, just make your return type int and return 0. It's up to you waht you want to do. I just think the non-macro approach is better.Bandy
@James - sorry, I messed up with this comment, erasing it while editing, so I reposted it as an answer. You were too fast to reply...Coven
I actually prefer in C to use 0 as false and non-zero as true w/o a specific type. In other cases where the call might fail, 0 is success and NZ is an error code (usually negative codes).Traditionalism
T
18

C99 has a boolean datatype, actually, but if you must use older versions, just define a type:

typedef enum {false=0, true=1} bool;
Traditionalism answered 11/11, 2010 at 22:8 Comment(1)
If you ask me, "emulating" bool pre-C99 is dangerous because the semantics differ. (bool)2 yields 2, not 1. A more realistic example: 1U<<(bool)isdigit(c) will give the wrong result on most implementations.Aalst
E
6

C99 has a bool type. To use it,

#include <stdbool.h>
Electrotherapy answered 10/8, 2016 at 6:54 Comment(1)
James McNellis's answer already says to do this.Salts
C
1

As an alternative to James McNellis answer, I always try to use enumeration for the bool type instead of macros: typedef enum bool {false=0; true=1;} bool;. It is safer b/c it lets the compiler do type checking and eliminates macro expansion races

Coven answered 11/11, 2010 at 22:10 Comment(7)
This doesn't prevent you from saying bool b = 1;Bandy
To the best of my knowledge, there is no additional type checking over what you would get with a #define bool int.Bandy
Oh, I think I see what you mean. However, you are talking about the variable declaration, while I am relating to the actual usage of the true and false tokens.Coven
Can you give an example of where additional type checking is done?Bandy
Well, its hard indeed, but just an example: float f; f = true; should raise a warning for the implicit (and supposedly incompatible) type cast.Coven
@Paul - I'm curious - are you sure this is a problem? If my memory serves me right, then enums are treated as ints. Ain't so? If you are right then this is definitely a good counter-example.Coven
@ysap: you're quick ! I deleted that comment almost immediately because I wasn't sure if I had remembered the problem exactly - I've just been trying to recreate an issue I know I had a while back with enums and ++ but it's still eluding me.Festal
A
0

C99 introduced _Bool as intrinsic pure boolean type. No #includes needed:

int main(void)
{
  _Bool b = 1;
  b = 0;
}

On a true C99 (or higher) compliant C compiler the above code should compile perfectly fine.

Anastasio answered 11/7, 2018 at 14:19 Comment(0)
W
0

We can use enum type for this.We don't require a library. For example

           enum {false,true};

the value for false will be 0 and the value for true will be 1.

Wasteland answered 12/7, 2018 at 15:16 Comment(0)
E
-3
struct Bool {
    int true;
    int false;
}

int main() {

    /* bool is a variable of data type – bool*/
    struct Bool bool;

    /*below I’m accessing struct members through variable –bool*/ 
    bool = {1,0};
    print("Student Name is: %s", bool.true);
    return 0;
}
Encarnacion answered 13/11, 2016 at 18:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.