The programming language C occupies an unusual position midway between conventional high-level and assembly languages, allowing the programmer to combine the best features of both. This book is an introduction to the language itself, and to the special style of thinking that goes with it. Anyone wishing to learn C is likely to have some experience in a high-level language such as BASIC or Pascal, and it seems sensible to make use of that experience. We therefore assume some facility with conventional notation for computer arith metic, and simple notions (such as looping and branching) common to most high-level languages. However, that cannot be the whole story. One cannot learn to speak colloquial French by thinking in English and performing a routine translation. No more can one learn to program in colloquial C by thinking in BASIC and performing a routine translation. However, when learning French it is normal to assume familiarity with English, building on that in the early stages, thereby creating the confidence necessary to provide that mot juste to which nothing corresponding exists in English. Our approach to C is similar. In particular we do not introduce at the very beginning some of the features of C which eventually lead to more efficient and elegant code-for example, the ability to do several things, apparently at once. Initially, such constructs can be confusing. Once the reader has acquired some facility with the language it then becomes possible to bring these features into play in a natural manner.