Skip to content


C is an imperative, procedural computer programming language with static type system.

C is specified by the following standards:

year name standard
1989 ANSI C (C89) ANSI X3.159-1989
1999 C99 ISO/IEC 9899:1999
2011 C11 ISO/IEC 9899:2011
Example: Hello World
int main() {
    if (a < 3){
        printf("Hello World");

TODO list all keywords


  • bitwise logic: ~, &, |, ^
  • bitwise shifts: <<, >>
  • boolean logic: !, &&, ||
  • equality testing: ==, !=
  • comparison: <, <=, >, >=

TODO diagram explaining the GNU tool chain: linker

Best practices#

Namespaces: use a capital prefix before each function name to indicate their belonging to a certain source file. Example: in led.c use LED_switchOn(); instead of switchOn() Reason: C does not support native namespaces and including header files could lead to name clashes.

Typedefs: declare enums and structs

Constants: for constants prefer const over preprocessor #define

Top-level static: If a function or global variable isn't exported in the header, declare it as static in the source file to give it internal linkage.

Const-Correctness: use const everywhere you can

Booleans: Use bool from stdbool.h whenever you have a boolean value

Pure Expressions: avoid function calls in expressions, such as if

Unsigned: Avoid unsigned types because the integer conversion rules are complicated

Sizeof: use sizeof on the variable; not the type

Assert: Use assert everywhere your program would fail otherwise

Naming: Never begin names with _ or end them with _t: they're reserved by future C standards