Awal pengembangan bahasa C terjadi di AT & T Bell Labs antara tahun 1969 dan 1973. C itu sendiri adalah bahasa pemrograman untuk tujuan umum. C juga terkait erat dengan operasi sistem UNIX yang juga dikembangkan menggunakan bahasa ini, baik sistem dan sebagian besar program yang berjalan. Namun, bahasa ini tidak terikat pada satu sistem operasi atau mesin dan meskipun telah disebut `` sistem bahasa pemrograman'' karena berguna untuk menulis compiler dan sistem operasi, dan telah digunakan sama baiknya untuk menulis program utama dalam domain yang berbeda.
Banyak dari ide-ide penting dalam C yang ada dari bahasa BCPL yang dikembangkan oleh Martin Richards. Banyak pengaruh BCPL pada C kemudian secara tidak langsung juga melalui bahasa B yang ditulis oleh Ken Thompson pada tahun 1970 untuk sistem UNIX yang pertama pada DEC PDP-7.
BCPL dan B adalah bahasa ''typeless" (tipe yang kurang beragam). Sebaliknya, C menyediakan berbagai tipe data. Jenis karakter fundamental, dan bilangan bulat (integer) beserta bilangan desimal (floating point) dari beberapa ukuran. Selain itu, ada hirarki tipe data turunan dibuat dengan pointer, array, struktur dan union. Ekspresi yaitu terbentuk dari operator dan operan; ekspresi apapun, termasuk tugas atau panggilan fungsi (function call), bisa menjadi pernyataan (statment). Pointer menyediakan untuk mechine-independent alamat aritmatika.
C menyediakan control-flow konstruksi dasar yang dibutuhkan untuk program yang terstruktur dengan baik: pengelompokan pernyataan (statment), pengambilan keputusan (if-else), pemilihan salah satu dari serangkaian nilai yang mungkin (switch), perulangan dengan tes terminasi di atas (while, for) atau di bagian bawah (do), dan keluar dari loop awal (break).
Fungsi dapat menghasilkan nilai-nilai dari jenis dasar, struktur, union, atau pointer. Fungsi apapun dapat dipangil secara rekursif. Variabel lokal biasanya "otomatis", atau dibuat baru dengan melibatkan masing-masing variabel tersebut. Fungsi definisi mungkin tidak bersarang tetapi variabel-variabel dapat dinyatakan dalam mode blok-terstruktur. Fungsi dari program C mungkin ada dalam file sumber terpisah yang dikompilasi secara terpisah. Cakupan variabel internal mungkin hanya untuk di dalam fungsi, tetapi cakupan variabel eksternal hanya diketahui dalam file sumber tunggal, atau terlihat untuk seluruh program.
Langkah preprocessing melakukan substitusi makro pada teks program, inklusi dari file sumber lain, dan kondisional kompilasi.
C adalah bahasa yang cenderung "low-level". Karakterisasi ini bukan merendahkan, itu hanya berarti bahwa C berkaitan dengan jenis yang sama objek yang kebanyakan komputer, yaitu karakter, angka, dan alamat. Ini dapat dikombinasikan dan berjalan dengan aritmatika dan operator logika diimplementasikan oleh mesin nyata.
Didalam C tidak ada operasi untuk menangani secara langsung dengan objek komposit seperti string karakter, set, list atau array. Tidak ada operasi yang memanipulasi seluruh array atau string, meskipun mungkin struktur disalin menjadi satu unit. Bahasa tidak mendefinisikan fasilitas alokasi penyimpanan lain dari definisi statis dan disiplin tetap disediakan oleh variabel fungsi lokal, tidak ada tumpukan atau koleksi sampah (gerbage collection). Akhirnya, C itu sendiri tidak memberikan fasilitas input/output, tidak ada Read atau Write statment, dan file acces methods yang tersedia. Semua mekanisme tingkat tinggi harus disediakan dengan pemanggilan fungsi secara eksplisit. Kebanyakan C implementasi telah menyertakan koleksi standar yang rasional seperti halnya fungsi.
Demikian pula, C menawarkan hanya langsung, satu-benang aliran kontrol: tes, loop, pengelompokan, dan subprogram, tetapi tidak multiprogramming, operasi paralel, sinkronisasi, atau coroutines.
Pada tahun 1983, American National Standards Institute (ANSI) membentuk komite untukmemberikan definisi modern, komprehensif C. Definisi yang dihasilkan, standar ANSI, atau `` ANSIC'', telah selesai pada akhir tahun 1988. Sebagian besar fitur standar yang sudah didukung oleh modern compiler.
Standar didasarkan pada referensi manual asli. Bahasa ini relatif sedikit berubah, salah satu tujuan dari standar ini adalah untuk memastikan bahwa sebagian besar program yang ada tetap berlaku atau gagal, bahwa compiler dapat menghasilkan peringatan dari perilaku baru.
Bagi kebanyakan programmer, perubahan yang paling penting adalah sintaks baru untuk menyatakan dan mendefinisikan fungsi. Sebuah deklarasi fungsi sekarang dapat meliputi deskripsi argumen fungsi. perubahan definisi syntax agar cocok. Ini tambahan agar lebih mudah bagi compiler untuk mendeteksi kesalahan yang disebabkan oleh argumen tidak cocok.
Ada perubahan bahasa dari skala kecil yang lain. Struktur assignment dan enumeration, yang telah tersedia secara luas, dan kini resmi menjadi bagian dari bahasa C. Perhitungan floating-point sekarang bisa dilakukan dalam presisi tunggal.
Sebuah kontribusi kedua yang signifikan dari standar ini adalah definisi library untuk C. Menentukan fungsi untuk mengakses sistem operasi (misalnya, untuk membaca dan menulis file), input dan output terformat, alokasi memori, manipulasi string, dan sejenisnya. Sebuah koleksi header standar menyediakan akses seragam untuk deklarasi fungsi dalam tipe data. Program yang menggunakan library untuk berinteraksi dengan sistem host terjamin kompatibel. Sebagian besar library erat dimodelkan pada `` standard I / O library''dari sistem UNIX. Library ini telah dijelaskan dalam edisi pertama, dan telah banyak digunakan pada sistem lainnya juga.
Karena tipe data dan struktur kontrol yang disediakan oleh C didukung langsung oleh kebanyakan komputer, run-time library yang dibutuhkan kecil untuk proses program secara mandiri. Fungsi-fungsi library standar hanya dipanggil secara eksplisit, sehingga bisa saja diabaikan jika tidak diperlukan.