C is a minimalistic programming language. Among its design goals were that it could be compiled in a straightforward manner using a relatively simple compiler, provide low-level access to memory, generate only a few machine language instructions for each of its core language elements, and not require extensive run-time support. As a result, C code is suitable for many systems-programming applications that had traditionally been implemented in assembly language.
Despite its low-level capabilities, the language was designed to encourage machine-independent programming. A standards-compliant and portably written C program can be compiled for a very wide variety of computer platforms and operating systems with minimal change to its source code. The language has become available on a very wide range of platforms, from embedded microcontrollers to supercomputers.
As an Algol-based language, C has the following characteristics:
A procedural programming paradigm, with facilities for structured programming Lexical variable scope and recursion
A static type system which prevents many meaningless operations Function parameters are generally passed by value (pass-by-reference is achieved in C by explicitly passing pointer values) Heterogeneous aggregate data types (struct in C) which allow related data elements to be combined and manipulated as a unit A small set (around 30) of reserved keywords
C also has the following specific properties:
Weak typing for instance, characters can be used as integers (similar to assembly) Low-level access to computer memory via machine addresses and typed pointers Function pointers allow for a rudimentary form of closures and runtime polymorphism Array indexing as a secondary notion, defined in terms of pointer arithmetic A standardized C preprocessor for macro definition, source code file inclusion, conditional compilation, etc. A simple, small core language, with functionality such as mathematical functions and file handling provided by library routines C discarded the well established logical connectives and and or of most other algol derivatives and replaced them with && and ||, which Were invented in order to make bit-wise operations (& and |) syntactically distinct C's predecessor B used & and | for both meanings Never evaluate the right operand if the result can be determined from the left alone C popularized the controversial decision to free the equal-sign for assignment use by replacing = with == (inherited from B). C lacks features found in some other systems implementation languages:
No non-scalar operations such as copying of arrays or strings (old versions of C did not even copy structs automatically) No automatic garbage collection
No bounds checking of arrays
No semi-dynamic (i.e. stacked, runtime-sized) arrays until the C99 standard (despite not requiring garbage collection) No syntax for ranges, such as the A..B notation used in both newer and older languages No nested function definitions (although some compilers provide them, for example, GCC) No formal closures or functions as parameters (only function and variable...