Jak priorita operátora C rozbije váš kód (a jak to opravit)

7

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ší.

  1. Závorky () a Indexace []
  2. Zleva doprava.
  3. Unární operátory ++, --, +, -, !, ~, (typ), * (dereference), & (adresa), sizeof
  4. Zprava doleva.
  5. Multiplikativní *, /, %
  6. Zleva doprava.
  7. Additiva +, -
  8. Zleva doprava.
  9. Shift <<, >>
  10. Zleva doprava.
  11. Vztahy <, <=, >, >=
  12. Zleva doprava.
  13. Rovnost ==, !=
  14. Zleva doprava.
  15. Bitové AND „&“.
  16. Zleva doprava.
  17. Bitový XOR ^