C är ett generellt, imperativt programspråk. Det tillhör familjen Algol-baserade språk och är avsett för strukturerad programmering.

C är ett av världens mest populära programspråk. Det finns C-kompilatorer för nästan alla plattformar, och dess syntax och standardbibliotek har standardiserats av ANSI och ISO. Det har inspirerat och legat till grund för många andra språk, som C++ och Java.

Historia miniatyr|Ken Thompson och Dennis Ritchie. Under slutet av 1960-talet började Unix utvecklas ur Multics vid dåvarande Bell Labs (nuvarande AT&T Bell Labs). Dennis Ritchie och Ken Thompson skrev det i makroassembler för minidatorn PDP-7. För att kunna skriva om det i ett högnivåspråk skapade Thompson med Ritchies hjälp programspråket B, en förenklad, minimalistisk version av BCPL anpassad för begränsat minnesutrymme. BCPL är i sin tur en förenklad version av CPL. B introducerade flera syntaktiska egenskaper som återfinns i C, såsom att jämförelser görs med dubbla likamedtecken. B började användas 1969.

B var dock inte ett generellt, plattformsoberoende programspråk. Det var anpassat för den hårdvara som det var skrivet på, PDP-7, och hade bland annat bara en enda datatyp (ordtypen). Ritchie påbörjade därför 1969 utvecklingen av ett nytt språk baserat på B, som han kallade för C, som skulle fungera på såväl mainframedatorer som mini- och mikrodatorer. Den första officiella versionen av Unix kom 1970. Det var då helt skrivet i assembler för PDP-11. Det motiverade än mer utvecklingen av C. Enligt Ritchie skedde den mesta utvecklingen av språket under 1972 och 1973 var det tillräckligt avancerat för att stora delar av Unix kunde skrivas om i det.

I Unix och C:s standardbibliotek anges tidsangivelser vanligen som antal sekunder som har passerat sedan midnatt den 1 januari 1970, så kallad Unix time.

K&R C 1978 gav Ritchie tillsammans med Brian Kernighan ut den första utgåvan av The C Programming Language, även känd som K&R efter "Kernighan & Ritchie". Boken fungerade länge både som referensverk och som en informell specifikation av språket. De tidiga C-kompilatorerna var inte alltid så strikta med syntaxen, vilket ledde till viss tolkningsfrihet och skillnader mellan olika kompilatorer. Den version av C som introducerades i boken har kommit att kallas för K&R C. Boken använde en formateringsstil, det vill säga regler för var man för läsbarhet sätter mellanslag och radbrytningar i källkoden, som lever kvar än i dag, bland annat i källkoden till Linux.

K&R C introducerade flera standardbibliotek, bland annat det för in- och utdata som i stort är oförändrat än i dag. Boken introducerade även datatyperna "long int" och "unsigned int", samt ett entydigt sätt att skriva kortformer av tilldelning och operation på.

Den andra utgåvan av boken kom 1988. Den behandlar det standardiserade ANSI C, som är mycket striktare i syntaxen.

ANSI och ISO C (C89/C90/C95)

Under slutet av 1970-talet och början av 1980-talet skrevs C-kompilatorer för ett stort antal mainframedatorer, minidatorer och mikrodatorer. Dessa var inte alltid kompatibla med varandra. 1983 skapade ANSI en kommitté kallad X3J11 med målet att skapa en specifikation för C. Den ratificerades den 7 december 1989 som ANSI X3.159-1989 "Programming Language C". Denna variant av C refereras oftast till som ANSI C eller C89. Året därpå antogs ANSI C som ISO-standard med namnet ISO/IEC 9899:1990. Denna version kallas ibland C90, och är i praktiken identisk med C89.

Redan under arbetet med att anta ANSI C som ISO-standard lades nya förslag fram på utökningar och förbättringar. Eftersom behovet av en färdig standard var trängande togs dessa förslag inte upp för behandling. I stället behandlades de separat och samlades i ett tillägg som lades fram i september 1994 och antogs året därpå som ISO/IEC 9899:1990/Amd 1:1995. Detta tillägg kallas Normative Addendum 1, Amendment 1 eller C95.

ANSI C inkluderar många av de utökningar av språket som hade skett under årens gång. Dessutom lades några nya egenskaper till, bland annat funktionsprototyper och void-pekare. Vissa förbättringar kom från C++. I samband med detta infördes krav på att kompilatorn skulle kontrollera typerna på parametrar till funktioner. Innan C89 gjordes detta inte (externa funktioner deklarerades int my_func();), något som gjorde att en del ansåg att C inte vara ett högnivåspråk.

Fortfarande flera år efter ratificeringen av ANSI C ansågs K&R C vara den minsta gemensamma nämnare som programmerare använde för att maximera kodens kompatibilitet med olika plattformar och kompilatorer.

C99

1999 kom en ny specifikation, ISO/IEC 9899:1999, vanligen kallad C99. C99 introducerade bland annat inline-funktioner, nya datatyper (long long int och complex) och officiellt stöd för radkommentarer som börjar med //, en syntaktisk funktion som fanns i BCPL och C++, och som redan stöddes av många C-kompilatorer.

C99 är mestadels bakåtkompatibel med C90, men är striktare i vissa avseenden. En funktionsdeklaration som saknar returtyp antas inte längre returnera en integer.

Stödet för C99 hos C-kompilatorer är ännu 2012 bristfälligt; många kompilatorer stöder stora delar, men få stöder allt. Bland de få som har fullt stöd finns IBM C.

C11

2007 påbörjades arbetet med en ny standard under det informella arbetsnamnet C1X. Den antogs i december 2011 som ISO/IEC 9899:2011, vanligen kallad C11. En stor nyhet i C11 var införandet av ett bibliotek för trådning samt stöd i språket för trådsäkra variabler och operationer.

Till följd av att stödet för C99 var så dåligt bland implementationer gjordes vissa delar av C11-standarden frivilliga att implementera, även sådana som är obligatoriska i C99. Ett exempel är stödet för komplexa typer, som är frivilligt i C11 men ett krav för C99-kompatibilitet. För att testa i fall en kompilator har stöd för komplexa typer och biblioteket <complex.h> kan man testa om makrot __STDC_NO_COMPLEX__ är definierat.

C18 En ny standard antogs 2018 som ISO/IEC 9899:2018, vanligen kallad C18. Denna version introducerade egentligen inget nytt, utan bestod uteslutande av korrigeringar och errata.

C23 Den senaste standarden antogs 2024 som ISO/IEC 9899:2024, vanligen kallad C23.

Arvet från C Att C utvecklades hand i hand med Unix gav det en mycket stark ställning inom Unix-världen, vilken det behåller än i dag. C är alltjämt mycket använt i exempelvis GNU och Linux. C blev tidigt det dominerande språket för utveckling på Microsoft Windows-plattformen, men trängdes ut av först C++ (via programbiblioteket Microsoft Foundation Classes), Delphi och Visual Basic, och sedermera C#.

För inbyggda system har C alltjämt en mycket stark ställning och för många hårdvarunära tillämpningar och realtidssystem är C fortfarande det dominerande språket. Starkt bidragande är att C-kompilatorer finns tillgängliga för de flesta plattformar. C har fördelen för hårdvarunära programmering att man har en rik flora olika heltalstyper och att man kan konvertera pekare ganska fritt.

Relaterade språk C är grund för flera andra moderna programspråk. I början av 1980-talet utvecklade Bjarne Stroustrup det objektorienterade språket C++, där konstruktioner hämtade från Simula 67 har lagts till C. Det är delvis, men inte fullständigt, bakåtkompatibelt med C så att vissa program går att kompilera både som C och C++. C++ har i sin tur använts som grund för språk som Java och C#, som dock inte är bakåtkompatibla med vare sig C eller C++.

Objective-C är ett annat objektorienterat programspråk baserat på C, med influenser från Smalltalk. Det är till skillnad från C++ fullständigt bakåtkompatibelt med C, så att källkod skrivet i C kan kompileras med en Objective-C-kompilator.

Syntax och uppbyggnad C är skiftlägeskänsligt, det vill säga det skiljer på versaler och gemener i nyckelord och namn så att getvalue, getValue och GetValue är olika namn. Av praxis används versaler sällan utom i preprocessordirektiv och konstanter.

Satser och block Varje sats i C är ett kommando som avslutas med ett semikolon, ;. I de flesta fall kan en sats bytas ut mot ett block av kod som inleds med en startklammerparentes, {, och avslutas med en slutklammerparentes, }.

Satser och block behöver inte vara på separata rader. Flera satser kan stå på samma rad och en sats kan vara utspridd över flera rader. Whitespace, det vill säga radbrytningar, tabulatorer och mellanslag, behandlas i de flesta fall lika och behövs bara mellan nyckelord och namn. Denna frihet ger möjligheten till olika kodformateringsstilar, varav en av de mest kända är den som Kernighan och Ritchie använde i The C Programming Language, den så kallade K&R-stilen.

Det främsta undantaget från whitespace-friheten är preprocessordirektiven, som måste stå först på raden och avslutas med en radbrytning eller en kommentar.

Programflöde Satserna i C exekveras sekventiellt, uppifrån och ner. Programflödet kan styras med villkorssatser, slingor och ovillkorliga hopp.

Det främsta sättet att göra villkorliga satser på är med if. if följs av ett logiskt uttryck inom parentes, och sedan en sats eller ett block som exekveras om och endast om det logiska uttrycket är sant. Detta kan valfritt följas av else och en sats eller ett block som exekveras om och endast om det logiska uttrycket är falskt. Som komplement till if i situationer där en och samma variabel jämförs med flera värden finns switch-satsen, motsvarande det som i vissa andra språk kallas case-satsen. Den tar ett numeriskt uttryck inom parentes och jämför resultatet med en lista av utfall. Utfallen skrivs med case före och ett kolon efter, och fungerar ungefär som radetiketter. Kodexekveringen fortsätter från respektive rad. Till skillnad från switch- och case-satser i en del andra språk stannar exekveringen inte när nästa case börjar. Vill man lämna switch-satsen använder man break (eller, om man vill avbryta hela funktionen, return). Om ingen matchande case finns fortsätter exekveringen från default om det finns, annars hoppas satsen över.

C har tre olika sorters slingor som också styr programflödet: for, while och do while. for används vanligen för att iterera genom ett antal element, till exempel en lista, med hjälp av en räknare. Till for-satsen hör en tilldelning av en räknare, ett villkor för att avbryta slingan, och en uppräkning av räknaren. while är en enklare slinga än for. Den följs av en parentes med endast ett villkor. do while fungerar precis som while, förutom att villkoret inte testas före första exekveringen; do while-slingan är därför garanterad att exekveras åtminstone en gång.

En slinga kan avbrytas i förtid med nyckelordet break. Exekveringen fortsätter då direkt efter slingan. Om programmet nästlar flera nivåer av slingor är det den närmaste som avbryts. Det går också att hoppa över resten av koden och fortsätta till nästa varv i slingan med nyckelordet continue. I for-slingor exekveras inkrementeringen, och i samtliga slingor testas villkoret. break och continue ger ovillkorliga hopp i programflödet. C tillhandahåller också goto, men det används i praktiken mycket sparsamt. Med goto kan man hoppa till en valfri plats i koden. Denna plats identifieras med ett namn, en radetikett, och avslutas med ett kolon. Till de ovillkorliga hoppen räknas också return, som avslutar eller avbryter en funktion, eventuellt med ett returvärde.

Funktioner Funktioner är en av de grundläggande byggstenarna i C. En funktion definieras i C med ett funktionsnamn, en returtyp, ett antal parametrar, samt ett kodblock. Om returtypen är void betyder det att funktionen inte har något returvärde, vilket motsvarar det som i andra programspråk kallas subrutin eller procedur. Funktioner med ett returvärde avslutas med nyckelordet return och returvärdet. Funktioner utan returvärde kan också avslutas med return, alternativt när slutet av kodblocket har nåtts.