ARM Technical Support Knowledge Articles


Applies to: C Programming Language


Information in this article applies to:


Keil Software and other companies say they provide "ANSI C" compilers. I've also seen references to "K&R C", "C89", "C90", "C9x", "C99", and "Standard C". What exactly do all these terms mean?


These terms are best understood with some historical context.

C was originally developed by a handful of researchers at Bell Labs in the early 1970's, along with the UNIX operating system.

For many years, the book The C Programming Language, by Brian W. Kernigan and Dennis M. Ritchie, was the de-facto standard reference for the language. This book (nicknamed K&R) was a very good and fairly complete introduction to the language, but it wasn't intended as a formal language specification.

By 1983, C had spread beyond UNIX to be used on many different platforms, and was still rapidly gaining popularity. It was time to create a platform-independent standard for C, so that it wouldn't become fragmented into dozens of severely incompatible dialects (like BASIC had).

ANSI (American National Standards Institute) published a formal standard for the language in 1989. The comittee that wrote the standard had done an excellent job, and the standard was quickly and enthusiastically accepted by almost everyone who used C. The original ANSI standard was officially called ANS X3.159-1989, but everyone called it the ANSI C standard, and the language it defined ANSI C.

To distinguish it from ANSI C, people began calling the language described in K&R K&R C. (A second edition of K&R, updated to present ANSI C, was published. It is still in print, and still one of the best introductions to C. The nickname K&R is now used to apply to either edition of the book, with terms like K&R1 and K&R2 used to distinguish them. But "K&R C" always means the pre-ANSI version of the language, i.e., a version of C without function prototypes.)

In 1990, a Joint Technical Comittee of ISO (International Standards Organization) and IEC (International Electrotechnical Commission) adopted the ANSI C standard, with only very minor changes, as an international standard, formally known as ISO/IEC 9899:1990. ANSI then officially adopted the international standard as a replacement for ANS X3.159-1989.

After ANSI adopted the ISO standard, some people, especially those who followed the standards process closely, switched from using the term "ANSI C" to Standard C, but the "ANSI C" had become so familiar that most people just kept using it. Even though the original ANSI C standard was officially obsolete a few months after its introduction, the nickname "ANSI C" has stuck even to today, especially in marketing materials.

Three updates to the standard were published in the mid-1990's. Here are brief descriptions quoted from the standard comittee's official website (the Technical Corrigenda contain only corrections and clarifications):

A revised version of the standard was published in 1999. It is officially ISO/IEC 9899:1999, but is more often referred to as C99. While it was being worked on, it was often referred to as C9x because people weren't sure which year it would be finished and officially adopted.

C89 and C90 are used interchangeably to refer any Standard C prior to C99.

Keil C compilers are based on C90. We added some language extensions as practical concessions to the architectural peculiarities of the microcontrollers we support and the needs of embedded systems programmers.


Article last edited on: 2006-10-09 10:42:31

Rate this article

Disagree? Move your mouse over the bar and click

Did you find this article helpful? Yes No

How can we improve this article?

Link to this article
Copyright © 2011 ARM Limited. All rights reserved. External (Open), Non-Confidential