Features
C is a relatively minimalist programming language. It is significantly lower-level than most other programming languages. Even though it is sometimes referred to as a "high level language", it is only really higher-level than the various assembly languages.
C has two important advantages over assembly. Firstly, code is generally easier to read and much less burdensome to write, especially for lengthy programs. Secondly, assembly code is usually applicable only to a specific computer architecture, whereas a C program can be ported to any architecture on which a C compiler and certain required libraries exist. (C code is almost always compiled, rather than interpreted.) On the other hand, the efficiency of C code is somewhat dependent on the ability of the compiler to optimize the resulting machine language, which is largely out of the programmer's control. In contrast, the efficiency of assembly code is precisely determined, since assembly is just human-readable notation for a machine language. For this reason, programs such as operating system kernelss, though mostly written in C, may contain "hand-tuned" fragments of assembly language where performance is especially crucial.
Similar advantages and disadvantages distinguish C from higher-level languages: the efficiency of C code can be more closely controlled, at the cost of being generally more troublesome to read and write. Note, however, that C is at least as portable as higher-level languages, because nowadays most computer architectures are equipped with a C compiler and libraries; in fact, the compilers, libraries, and interpreters of higher-level languages are often implemented in C!
One of the most notable features of C is that it is up to the programmer to manage the contents of computer memory. Standard C provides no facilities for array bounds checking or automatic garbage collection. In contrast, the Java and C# languages, both descendants of C, provide automatic memory management, including garbage collection. While manual memory management provides the programmer with greater leeway in tuning the performance of a program, it also makes it easy to produce bugs involving erroneous memory operations, such as buffer overflows. Bugs of these sort have gained notoriety for their effects on computer insecurity. Some tools have been created to help C programmers avoid memory errors, including libraries for performing array bounds checking and automatic garbage collection, and automated source code checkers such as Lint.
Some of the specific features of C are: