Píšete, co máte na mysli. Kompilátor si přečte, co chce.
Pokud jste se někdy podívali na řádek kódu C, přesvědčili se, že dělá jednu věc, a pak jste sledovali, jak dělá něco úplně jiného, narazili jste na přednost operátora. To není chyba. To je vlastnost jazyka, která kouše i zkušené vývojáře.
Vezměme si tuto jednoduchou aritmetiku:
x=5+3*6;
Ve škole matematici říkají: nejprve sčítání. V C říkají: ne. Násobení a dělení jsou na vyšší úrovni než sčítání a odčítání. Kompilátor nejprve vynásobí 3 x 6. Pak přidá 5. X dostane 23. Ne 48. Právě jste ztratili body v testu. Nebo v horším případě v produkčním nasazení.
Zmatek se prohloubí, když smícháte operátory se syntaxí.
Podívejte se na tento inzerát:
char *a[10];
Je a ukazatel na pole o 10 znacích? Nebo je to pole 10 znakových ukazatelů?
Aniž byste znali konkrétní pravidla priority, hádáte. V C jsou hranaté závorky [] omezeny přísněji než ukazatele *. Jde tedy o pole 10 znakových ukazatelů.
To je důležité, protože C není analyzováno jako angličtina. Je chápána jako rigidní hierarchie.
Můžete napsat kód, který vypadá správně, ale tiše selže kvůli prioritě.
Podívejme se na aritmetiku ukazatele smíchanou s přístupem ke struktuře.
“*p.i = 10;”.
Toto nefunguje podle očekávání. Operátor tečky . má vyšší prioritu než operátor dereference *. Kompilátor se pokusí získat přístup k členu i objektu, na který ukazuje p, než dereferencuje p. Ale p je ukazatel, ne struktura. Kompilátor klopýtá. Nebo hůře, interpretuje paměť způsobem, který způsobuje poškození dat.
Musíte stát na svém.
“(*p).i = 10;”.
Vyhrávají závorky. Vždy.
Hierarchie operátorů
Kernighan a Ritchie, architekti C, stanovili prioritu ve svém klasickém textu. Níže uvedená tabulka ukazuje pořadí. Horní řádek má nejvyšší prioritu. Spodní část je nejmenší.
- Závorky
()a Indexace[] - Zleva doprava.
- Unární operátory
++,--,+,-,!,~,(typ),*(dereference),&(adresa),sizeof - Zprava doleva.
- Multiplikativní
*,/,% - Zleva doprava.
- Additiva
+,- - Zleva doprava.
- Shift
<<,>> - Zleva doprava.
- Vztahy
<,<=,>,>= - Zleva doprava.
- Rovnost
==,!= - Zleva doprava.
- Bitové AND „&“.
- Zleva doprava.
- Bitový XOR
^



























