Ovaj članak pruža opsežan vodič koji će vam pomoći u učenju o asocijativnosti i prednosti operatora u C-u.
Prioritet operatora u C
Prioritet operatora opisuje slijed u kojem se procjenjuje nekoliko operatora dok se procjenjuju izrazi. Na primjer, ako izraz ima i operatore zbrajanja i množenja, koji od njih treba prvi procijeniti? Odgovor je jednostavan, C slijedi određena pravila za rješavanje takve dvosmislenosti, općenito poznata kao prednost operatora . U C, prednost operatora je razvrstan u 17 razina, u rasponu od unarnih operatora do ternarnog uvjetnog operatora. Većina korištenih operatora kao što su aritmetički operatori, relacijski operatori, logički operatori i bitovni operatori slijede standard C prednost operatora protokol.
Prednost pravila diktiraju koji operatori imaju veći prioritet od ostalih pri procjeni izraza. Nekoliko vrsta operatora u programskom jeziku C ima različite stupnjeve prednost . Na primjer, unarni operatori imaju veći prioritet od binarnih operatora. Slijedi popis operatora poredanih uzlaznim redoslijedom od prednost :
Operater | Značenje operatora | Asocijativnost |
() [] -> . |
Funkcionalni poziv Referenca elementa polja Neizravni izbor članova Izravan odabir članova |
S lijeva nadesno |
! ~ + – ++ — i * veličina (tip) |
Logička negacija Komplement po bitovima (1). Unarni plus Unarni minus Povećanje Smanjenje Dereferenciranje (adresa) Referenca pokazivača Vraća veličinu objekta Typecast (pretvorba) |
S desna na lijevo |
* / % |
Pomnožiti Podijeliti Ostatak |
S lijeva nadesno |
+ – |
Binarni plus (zbrajanje) Binarni minus (oduzimanje) |
S lijeva nadesno |
<< >> |
Lijevi pomak Desni pomak |
S lijeva nadesno |
< <= > >= |
Manje od Manje od ili jednako Veći od Veće ili jednako |
S lijeva nadesno |
== != |
Jednak Nije jednako |
S lijeva nadesno |
i | Bitno I | S lijeva nadesno |
^ | Bitno isključivi OR | S lijeva nadesno |
| | Bitno OR | S lijeva nadesno |
&& | Logično I | S lijeva nadesno |
|| | Logički ILI | S lijeva nadesno |
?: | Uvjetni operator | S desna na lijevo |
= *= /= %= += -= &= ^= |= <<= >>= |
Jednostavan zadatak Dodijeli proizvod Dodijeli kvocijent Dodijeli ostatak Dodijeli zbroj Dodijeli razliku Dodijeli bitovi I Dodijeli bitwise XOR Dodijeli bitwise OR Dodjela lijevog pomaka Dodijelite desni pomak |
S desna na lijevo |
, | Razdjelnik izraza | S lijeva nadesno |
Ova pravila usmjeravaju prevoditelj kako procijeniti izraze s višestrukim operatorima u istom izrazu. Operator množenja, na primjer, ima veću prednost od operatora zbrajanja u jednadžbi A + B * C, u skladu s prednost pravila. Stoga će prevodilac prvo evaluirati izraz B * C prije dodavanja A rezultatu.
Pogledajmo primjer prednost operatora kroz kod.
#includeint glavni ( ) {
int a = 43 , b = jedanaest , c = 16 , d = 31 ;
int proizlaziti = ++ a * b -- + c / -- d ;
printf ( 'a = %d \n ' , a ) ;
printf ( 'b = %d \n ' , b ) ;
printf ( 'c = %d \n ' , c ) ;
printf ( 'd = %d \n ' , d ) ;
printf ( 'rezultat = %d \n ' , proizlaziti ) ;
povratak 0 ;
}
Četiri varijable a, b, c i d deklarirane su u gornjem kodu, a njihove početne vrijednosti su 43, 11, 16 i 31 prema tome. Zatim primjenjuje razne aritmetičke i operatore dodjele na ove varijable u izrazu. Izraz povećava vrijednost a pomoću operatora predinkrementiranja ++a, množi ishod s operatorom postdekrementiranja b–, a zatim dodaje ishod dijeljenju c s prethodno dekrementiranom vrijednošću d. (koristeći operator preddekrementiranja –d). Varijabla rezultat se zatim koristi za držanje ukupnog ishoda ovog izraza.
Izlaz
Asocijativnost u C
Asocijativnost odnosi se na redoslijed kojim se operatori procjenjuju tijekom izraza s istim prvenstvom. Slijeva na desno i zdesna na lijevo asocijativnost su dva oblika asocijativnosti u C. Ako dva operatora imaju isti prednost , ocjenjuju se slijeva na desno prema konceptu slijeva nadesno asocijativnost . Unatoč tome, ako se promatra isti prioritet, operatori se procjenjuju s desna na lijevo prema zdesna nalijevo asocijativnost .
Na primjer, operator povećanja ++ ima zdesna nalijevo asocijativnost , što znači prirast operater se vrednuje nakon varijable. Dok je logično I operater ima slijeva nadesno asocijativnost , što znači da se operator procjenjuje s lijeva na desno.
#includeint main() {
int a = 6 , b = 3 , c = 2 ;
int rezultat = a * b / c;
printf( 'rezultat = %d \n ' , rezultat);
povratak 0 ;
}
Tri varijable a, b i c su deklarirane u ovom kodu i inicijalizirane su na 6, 3 i 2 redom. Zatim primjenjuje operacije množenja i dijeljenja na te varijable u izrazu. Množenje i dijeljenje poredani su slijeva nadesno u C na temelju njihovog asocijativnost budući da imaju istu razinu prvenstva. To znači da operacija dijeljenja dolazi prva, a nakon nje operacija množenja pri vrednovanju izraza, a * b / c.
Izlaz
Zaključak
Prioritet operatora i asocijativnost ključni su koncepti u C programiranju koji pomažu odrediti redoslijed izvođenja izraza. Operatori s najvišim prednost razina se prvo ocjenjuju i asocijativnost pravila pomažu odrediti redoslijed kada se koristi više operatora s istim prvenstvom. Razumijevanje prednost operatora i asocijativnost ključan je pri dizajniranju složenih programa i pomaže u izradi čišćeg i učinkovitijeg koda s manje pogrešaka.