Ta članek ponuja obsežno vadnico, ki vam bo pomagala pri učenju o asociativnosti in prednosti operatorjev v C.
Prednost operaterja v C
Prednost operaterja opisuje zaporedje, v katerem je med vrednotenjem izrazov ovrednotenih več operatorjev. Na primer, če ima izraz tako operatorje seštevanja kot množenja, katerega je treba najprej ovrednotiti? Odgovor je preprost, C sledi določenim pravilom za razrešitev takšnih dvoumnosti, splošno znanih kot prednost operaterja . V C, prednost operaterja je razvrščen v 17 stopenj, od unarnih operatorjev do ternarnega pogojnega operatorja. Večina uporabljenih operatorjev, kot so aritmetični operatorji, relacijski operatorji, logični operatorji in bitni operatorji, sledi standardu C prednost operaterja protokol.
Prednost pravila narekujejo, kateri operaterji imajo višjo prednost od drugih pri ocenjevanju izrazov. Več vrst operatorjev v programskem jeziku C ima različne stopnje prednost . Unarni operatorji imajo na primer večjo prednost kot binarni operatorji. Sledi seznam operatorjev, razvrščenih v naraščajočem vrstnem redu prednost :
Operater | Pomen operaterja | Asociativnost |
() [] -> . |
Funkcionalni klic Referenca elementa matrike Posredna izbira člana Neposredna izbira članov |
Od leve proti desni |
! ~ + – ++ — & * sizeof (tip) |
Logična negacija Bitni (1-ji) komplement Enarni plus Enarni minus Prirastek Zmanjšaj Odstranitev imena (naslov) Referenca kazalca Vrne velikost predmeta Typecast (pretvorba) |
Od desne proti levi |
* / % |
Pomnožite Razdeli Ostanek |
Od leve proti desni |
+ – |
Binarni plus (seštevanje) Binarni minus (odštevanje) |
Od leve proti desni |
<< >> |
Levi shift Desni premik |
Od leve proti desni |
< <= > >= |
Manj kot Manj ali enako Večji kot Večje ali enako |
Od leve proti desni |
== != |
Enako Ni enako |
Od leve proti desni |
& | Bitno IN | Od leve proti desni |
^ | Bitno izključujoč ALI | Od leve proti desni |
| | Bitni ALI | Od leve proti desni |
&& | Logični IN | Od leve proti desni |
|| | Logični ALI | Od leve proti desni |
?: | Pogojni operater | Od desne proti levi |
= *= /= %= += -= &= ^= |= <<= >>= |
Preprosta naloga Dodeli izdelek Dodeli količnik Dodeli preostanek Dodeli vsoto Dodeli razliko Dodeli bitni IN Dodeli bitni XOR Dodeli bitni ALI Dodeli levi premik Dodelite desni premik |
Od desne proti levi |
, | Ločilo izrazov | Od leve proti desni |
Ta pravila usmerjajo prevajalnik, kako ovrednotiti izraze z več operatorji v istem izrazu. Operator množenja ima na primer večjo prednost kot operator seštevanja v enačbi A + B * C v skladu z prednost pravila. Zato bo prevajalnik najprej ovrednotil izraz B * C, preden bo rezultatu dodal A.
Oglejmo si primer prednost operaterja prek kode.
#includeint glavni ( ) {
int a = 43 , b = enajst , c = 16 , d = 31 ;
int rezultat = ++ 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 ' , rezultat ) ;
vrnitev 0 ;
}
Štiri spremenljivke a, b, c in d so deklarirane v zgornji kodi, njihove začetne vrednosti pa so 43, 11, 16 in 31. Nato tem spremenljivkam v izrazu uporabi različne aritmetične in operatorje dodeljevanja. Izraz poveča vrednost a z uporabo operatorja pred povečevanjem ++a, pomnoži izid z operatorjem po zmanjševanju b– in nato doda rezultat deljenju c s predhodno zmanjšano vrednostjo d. (z uporabo preddekrementnega operaterja –d). Spremenljivka rezultat se nato uporabi za shranjevanje skupnega rezultata tega izraza.
Izhod
Asociativnost v C
Asociativnost se nanaša na vrstni red, v katerem so operatorji ovrednoteni med izrazom z enako prednostjo. Od leve proti desni in od desne proti levi asociativnost sta dve obliki asociativnosti v C. Če imata dva operatorja enako prednost , se ocenjujejo od leve proti desni v skladu s konceptom od leve proti desni asociativnost . Kljub temu, če se opazi enaka prednost, so operatorji ovrednoteni od desne proti levi glede na desno proti levi asociativnost .
Na primer, operator prirastka ++ ima desno proti levi asociativnost , kar pomeni prirastek operater se ovrednoti po spremenljivki. Medtem ko logični IN operater ima levo proti desni asociativnost , kar pomeni, da je operator ocenjen od leve proti desni.
#includeint main() {
int a = 6 , b = 3 , c = 2 ;
int rezultat = a * b / c;
printf( 'rezultat = %d \n ' , rezultat);
vrnitev 0 ;
}
Tri spremenljivke a, b in c so deklarirane v tej kodi in so inicializirane na 6, 3 oziroma 2. Nato za te spremenljivke v izrazu uporabi operacije množenja in deljenja. Množenje in deljenje sta razvrščena od leve proti desni v C glede na njihovo asociativnost saj imata enako stopnjo prednosti. To pomeni, da je pri vrednotenju izraza najprej operacija deljenja, ki ji sledi operacija množenja, a * b / c.
Izhod
Zaključek
Prednost operaterja in asociativnost so ključni pojmi v programiranju C, ki pomagajo določiti vrstni red izvajanja izrazov. Operaterji z najvišjo prednost ravni se najprej oceni in asociativnost pravila pomagajo določiti vrstni red, ko je uporabljenih več operatorjev z isto prednostjo. Razumevanje prednost operaterja in asociativnost je bistvenega pomena pri načrtovanju kompleksnih programov in pomaga ustvariti čistejšo in učinkovitejšo kodo z manj napakami.