सी प्रोग्रामिंग भाषा का विकास 1969 से 1973 के मध्य एटी एंड टी बेल लैबोरेटरीज (AT&T Bell Laboratories) में कंप्यूटर वैज्ञानिक डेनिस रिची (Dennis Ritchie) द्वारा किया गया था। इसका प्राथमिक उद्देश्य यूनिक्स (Unix) ऑपरेटिंग सिस्टम के कर्नल को पुन: लिखना था, जो उस समय हार्डवेयर-विशिष्ट असेंबली भाषा में था। सी भाषा ने यूनिक्स को पोर्टेबल (अन्य कंप्यूटरों पर आसानी से चलने योग्य) बना दिया।
सी भाषा का विकास निम्नलिखित ऐतिहासिक अनुक्रम से हुआ:
- ALGOL 60 (1960): ब्लॉक-संरचित प्रोग्रामिंग और औपचारिक व्याकरण का सूत्रपात।
- CPL (Combined Programming Language, 1963): अत्यंत शक्तिशाली किंतु कंपाइलर निर्माण में अत्यधिक जटिल भाषा।
- BCPL (Basic Combined Programming Language, 1967): कैम्ब्रिज के मार्टिन रिचर्ड्स द्वारा विकसित सरल और टाइप-रहित भाषा।
- B भाषा (1969): बेल लैब्स में केन थॉम्पसन द्वारा यूनिक्स के प्रारंभिक विकास हेतु निर्मित सरल भाषा।
- C भाषा (1972): डेनिस रिची ने B भाषा में डेटा प्रकार (Data Types), संरचनाएं और पॉइंटर्स जोड़कर आधुनिक सी भाषा की रचना की।
- ANSI C (C89/C90): 1989 में अमेरिकन नेशनल स्टैंडर्ड्स इंस्टीट्यूट द्वारा सी का वैश्विक मानक निर्धारित किया गया।
एक सुव्यवस्थित सी प्रोग्राम में मुख्य रूप से छह अनुभाग होते हैं:
- दस्तावेज़ीकरण अनुभाग (Documentation Section): प्रोग्राम के उद्देश्य, लेखक और नियमों से संबंधित टिप्पणियां (Comments)। सी में बहु-पंक्ति टिप्पणी (`/* टिप्पणी */`) और C99 एकल-पंक्ति टिप्पणी (`// टिप्पणी`) मान्य हैं। कंपाइलर प्रीप्रोसेसिंग के दौरान टिप्पणियों को हटा देता है।
- लिंक अनुभाग (प्रीप्रोसेसर निर्देश): हेडर फ़ाइलों को शामिल करने के निर्देश (`#include <stdio.h>`, `#include <math.h>`), जो मानक लाइब्रेरी फ़ंक्शंस के प्रोटोटाइप प्रदान करते हैं।
- परिभाषा अनुभाग (Definition Section): `#define` निर्देश द्वारा प्रतीकात्मक स्थिरांक घोषित करना (`#define PI 3.14159`)।
- ग्लोबल घोषणा अनुभाग: सभी फ़ंक्शंस में प्रयुक्त होने वाले ग्लोबल चरों और यूज़र-डिफ़ाइंड फ़ंक्शंस के प्रोटोटाइप की घोषणा।
- मुख्य फ़ंक्शन अनुभाग (`main()`): प्रत्येक सी प्रोग्राम का अनिवार्य प्रवेश द्वार (Entry Point)। प्रोग्राम का निष्पादन सदैव `main()` से ही प्रारंभ होता है। आधुनिक ANSI C में इसे `int main(void)` घोषित कर अंत में ऑपरेटिंग सिस्टम को सफलता का संकेत देने हेतु `return 0;` लिखा जाता है।
- उप-प्रोग्राम अनुभाग (यूज़र-डिफ़ाइंड फ़ंक्शंस): प्रोग्राम की कार्यप्रणाली को मॉड्यूलर बनाने हेतु `main()` के बाहर परिभाषित किए गए अन्य स्वतंत्र फ़ंक्शंस।