The power of C

Modern languages try to restict side-effects as much as possible. Object state should be changed by going through interfaces (methods) and nothing else. C statements can access any part of the programs data directly because memory addresses are available. This means that a simple C statement can change data without overhead - but also without protection.

Some C compilers allow insertion of assembly language statements right in the middle of C code to modify registers or use special functions from the CPUs instruction set.

C strings and other data structures are NOT bounds checked at runtime. This is of course faster than with bounds checking

The C runtime creates little overhead. No garbage collection e.g.

C types are defined with "best size per CPU" and not with an absolute length. This way an "int" integer type can be 16 bit, 32 bit or 64 bit, whatever suits your hardware best. Interoperability across machines becomes of course more difficult.