Je schrijft wat je bedoelt. De compiler leest wat hij wil.
Als je ooit naar een regel C-code hebt gestaard in de overtuiging dat deze iets anders deed, om vervolgens te zien hoe deze iets heel anders deed, dan heb je voldaan aan de prioriteit van de operator. Het is geen bug. Het is een kenmerk van de taal dat zelfs doorgewinterde ontwikkelaars bijt.
Neem deze eenvoudige rekensom:
x=5+3*6;
Wiskundeles zegt eerst toevoegen. C zegt nee. Vermenigvuldigen en delen staan op een hoger niveau dan optellen en aftrekken. De compiler vermenigvuldigt eerst 3 met 6. Dan wordt er 5 bij opgeteld. X krijgt 23. Niet 48. Je hebt zojuist punten verloren bij een quiz. Of erger nog, een productie-implementatie.
De verwarring wordt groter als je operators met syntaxis combineert.
Kijk naar deze verklaring:
char *a[10];
Is a een verwijzing naar een array van 10 tekens? Of is het een array van 10 verwijzingen naar karakters?
Zonder de specifieke voorrangsregels te kennen, gokt u. In C binden haakjes [] strakker dan wijzers *. Dit is dus een array van 10 verwijzingen naar tekens.
Dit is van belang omdat C niet zoals Engels parseert. Het ontleedt als een rigide hiërarchie.
Je kunt code schrijven die er goed uitziet, maar stilletjes faalt vanwege voorrang.
Overweeg aanwijzerberekeningen gecombineerd met structuurtoegang.
*p.i = 10;
Dit werkt niet zoals verwacht. De puntoperator . heeft een hogere prioriteit dan de dereferentieoperator *. De compiler probeert toegang te krijgen tot lid i van het object waarnaar p verwijst voordat de verwijzing naar p wordt verwijderd. Maar p is een pointer, geen struct. De compiler verslikt zich. Of erger nog, het interpreteert het geheugen op een manier die gegevens corrumpeert.
Je moet het probleem forceren.
(*p).i = 10;
Haakjes winnen. Altijd.
De hiërarchie van operators
Kernighan en Ritchie, de architecten van C, hebben in hun klassieke tekst de prioriteit uiteengezet. Onderstaande tabel toont de volgorde. De bovenste lijn is het hoogst. Bodem is het laagst.
- Haakjes
()en Abonnementen[] - Van links naar rechts.
- Unaire operators
++,--,+,-,!,~,(type),*(dereferentie),&(adres),sizeof - Rechts naar links.
- Multiplicatief
*,/,% - Van links naar rechts.
- Toevoegsel
+,- - Van links naar rechts.
- Verschuiving
<<,>> - Van links naar rechts.
- Relationeel
<,<=,>,>= - Van links naar rechts.
- Gelijkheid
==,!= - Van links naar rechts.
- Bitgewijs EN
& - Van links naar rechts.
- Bitgewijs XOR
^



























