додому Internet a IT Programování Jak priorita operátora C rozbije váš kód (a jak to opravit)

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

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 ^
Exit mobile version