_Bool and void
Two of C's types are special because of what they represent: a yes/no answer, and nothing at all. _Bool is the type for a truth value — it can only be true or false. void is the type that means 'no value here', used to say a function gives nothing back or to declare a function that takes no arguments.
_Bool was added to C in 1999. It stores 0 for false and 1 for true; assigning any non-zero value to it produces 1. If you include the header stdbool.h you get the friendlier spellings bool, true, and false that just map onto _Bool, 1, and 0. void appears in three everyday roles: as a return type, 'void f(void)' says f returns nothing; as a parameter list, the inner void says f takes no parameters at all; and you cannot declare a variable of type void because there is no value to store. (A separate construct, the void pointer, is a different idea covered elsewhere — it is a pointer that points to bytes of unknown type, not a void value.)
Why they matter: before _Bool, C programmers used plain int with 0 and 1 to fake booleans, which works but hides intent and lets stray values sneak in. _Bool documents that a variable is a flag. void keeps function signatures honest: it lets the compiler check that you do not try to use a result that does not exist, and that you do not accidentally pass arguments to a function meant to take none. A common trap: in old C, writing 'int f()' with empty parentheses means 'arguments unspecified', NOT 'no arguments' — write 'int f(void)' to truly mean none.
#include <stdbool.h> bool is_ready = false; is_ready = true; void greet(void) { /* returns nothing, takes nothing */ }
bool (from stdbool.h) names a truth value clearly; void as both the return type and the parameter list says greet gives and takes nothing.
void the type ('no value') is not the same as a void pointer ('pointer to unknown type'). And empty parentheses in an old-style declaration like int f() mean 'unspecified arguments', not 'no arguments' — use int f(void) for the latter.