# Programmeren in C/Inleiding

De programmeertaal C heeft zich sinds zijn eerste implementatie door Kernigan en Ritchie ontwikkeld tot een van de belangrijkste en meest gebruikte computertalen ter wereld. Dit is voornamelijk te danken aan het feit dat de taal niet alleen zeer compact is, er hoeft geen woord meer geschreven te worden dan strikt noodzakelijk, maar ook erg op daadwerkelijke computerhardware is gericht. C is de taal waarin de meeste operating systems en tal van toepassingen zijn geschreven en is in de regel de eerste taal die voor nieuwe processoren wordt geimplementeerd.
Toch is C niet aan te raden voor beginners. Voornamelijk omdat het zich, taalkundig, enige vrijheden veroorlooft, die weliswaar zeer nuttig zijn voor wie weet wat hij doet, maar de beginner ruimschoots genoeg touw bieden om zich aan op te knopen. Mensen zonder programmeer ervaring hebben dan ook veel meer aan een strakker gedefiniëerde taal met minder voetangels en klemmen.
Het hoofddoel van de taal C is de programmeur zo vrij mogelijk te laten en hem directe toegang te bieden tot de hardware als dat nodig is en toch alle comfort van een hogere programmeertaal te bieden. Dit houdt onder andere in dat typechecking niet, zoals in bijvoorbeeld Pascal, rigide is, maar onderworpen aan de programmeur, de grenzen van arrays niet worden bewaakt, het beheer van het geheugen (memory management) grotendeels handmatig moet worden geimplementeerd en initialisatie van variabelen en gealloceerd geheugen expliciet moet plaatsvinden. Al met al meer dan genoeg om de beginnende programmeur aan te raden ergens anders mee te beginnen.
Wat voor de beginner een taal is vol met valkuilen, heeft zich echter om precies dezelfde redenen ontwikkeld tot hoofdgereedschap voor professionals. Operating systems zoals Unix en Linux zijn bijna geheel in C geschreven, evenals vele professionele toepassingen, vooral als ze strenge eisen stellen aan geheugen gebruik en snelheid.

### Platform-onafhankelijk

Een van de hoofddoelen van elke programeertaal is de broncode onafhankelijk te maken van het onderliggende hardware-platform. Code geschreven op een processor zou zonder al te grote ingrepen moeten draaien op elke andere processor. Dit geldt in het bijzonder voor de taal C omdat er praktisch geen processor te vinden is waarvoor geen compiler bestaat, van mainframes tot micro-controllers. Dit stelt niet alleen hoge eisen aan de taal zelf, maar vooral aan de programmeur, die zich er terdege bewust van moet zijn op welke aannames de broncode die hij schrijft gebaseerd zijn.
Zo is het een bekende fout aan te nemen dat een integer een bepaald aantal bits telt, terwijl de C-Standaard juist grote moeite doet dit soort aannames te vermijden. Vooral in kringen van PC-programmeurs wordt nog wel eens aangenomen dat de hele wereld 32 bits heeft, wat op de meeste PC's ook inderdaad het geval is. Tot men een 64-bits processor krijgt en de software plotseling rare dingen gaat doen. Een andere veelvoorkomende fout zijn impliciete aannames omtrent de endianness van getallen, de inrichting van het file-system, etc.
Omdat C grote moeite doet om aannames omtrent het onderliggende Operating System en de hardware te vermijden, is het onmogelijk om alle functionaliteiten in een standaard taal onder te brengen. Zo kent C geen enkele vorm van netwerk-software, weet niets van een directory-structuur en heeft geen enkele functie die zich met graphics bezighoudt. Deze dingen zijn allemaal onderdeel van het onderliggende platform en zijn in de regel in platform afhankelijke programma-bibliotheken (libraries) ondergebracht door de leverancier van het OS.
Dit boek houdt zich uitsluitend bezig met standaard C, dus zal geen aandacht besteden aan directory structuren, graphics, geluid, fonts, muizen, toetsenborden en alle andere eye-candy die moderne operating systems bieden.

### Standaarden

De taal C heeft zich in de loop der jaren tamelijk sterk ontwikkeld. De originele implementatie, door Kernighan en Ritchie is inmiddels hopeloos verouderd en vervangen door C89 (ook wel ANSI-C) en C99. Deze standaarden worden beheerd door de International Standards Organisation (ISO) en stellen zeer strikte eisen aan de compiler. Niet alleen wordt voorgeschreven wat verschillende taal-elementen zoals if-else, while en switch precies moeten doen en welke functies in de standaard bibliotheken aanwezig moeten zijn, maar ook hoeveel bits diverse datatypes moeten hebben, welke foutmeldingen en waarschuwingen onder welke omstandigheden moeten worden gegenereerd.
Omwille van de eenvoud zal dit boek zich voornamelijk richten op de (op het ogenblik) meest gebruikte standaard: C89. De K&R standaard is dusdanig verouderd dat het hooguit van historisch belang is en C99 lijkt zoveel op C89 dat deze standaard alleen aan bod zal komen als er belangrijke afwijkingen zijn.