A programozás alapjai 1 Kifejezések 5. előadás Híradástechnikai Tanszék Operandusok Literál Azonosító Kifejezés Kifejezések Precedencia Melyik hajtódik először végre? Asszociativitás Balról jobbra vagy jobbról balra köt? precedenciája () []. ->! ~ ++ -- + - * & (<típus>) sizeof * / % + - << >> < <= > >= ==!= precedenciája & ^ &&?: = += -= *= /= %= &= ^= = <<= >>=, 1
precedenciája precedenciája A precedencia zárójelezéssel megtörhető! Az operandusok kiértékelési sorrendje nem meghatározott! A mellékhatások kiszámíthatatlanok! Megoldás: zárójelezés segédváltozók használata Minden igazságérték jellegű eredmény függvényhívás és értéke int típusú, 0, ha hamis <függvény>(<paraméterek>) 1, ha igaz tömbhivatkozás struktúrahivatkozás <tömb>[<index>] <struktúra>.<tag> <struktúra mutató>-><tag> 2
logikai tagadás! <kifejezés> 1-es komplementálás (bitenkénti negálás) ~<kifejezés> utótagos inkrementálás/dekrementálás előtagos inkrementálás/dekrementálás <hivatkozás>++ <hivatkozás>-- ++<hivatkozás> --<hivatkozás> egyoperandusú plusz/mínusz indirekció +<aritmetikai kifejezés> *<mutató> -<aritmetikai kifjezés> 3
címképzés kényszerített típusmódosítás (casting) &<azonosító> (<típus>)<kifejezés> Konverzió csak aritmetikai típusoknál van! tárolás helyigénye (karakterekben) multiplikatív operátorok sizeof<kifejezés> sizeof(<típus>) A kifejezés nem értékelődik ki! Casting esetén elég az operátor is! <kifejezés>*<kifejezés> <kifejezés> /<kifejezés> <kifejezés>%<kifejezés> additív operátorok léptető operátorok <kifejezés>+<kifejezés> <kifejezés>-<kifejezés> <egész> << <nemnegatív egész> <egész> >> <nemnegatív egész> 4
relációs operátorok egyenlőségi operátorok <kifejezés><<kifejezés> <kifejezés><=<kifejezés> <kifejezés>><kifejezés> <kifejezés>==<kifejezés> <kifejezés>!=<kifejezés> <kifejezés>>=<kifejezés> bitenkénti és bitenkénti kizáró vagy (antivalencia) <egész kifejezés>&<egész kifejezés> <egész kifejezés>^<egész kifejezés> bitenkénti vagy logikai és <egész kifejezés> <egész kifejezés> <egész kifejezés>&&<egész kifejezés> Az operandusok balról jobbra értékelődnek ki! Ha az első kifejezés HAMIS, a második NEM ÉRTÉKELŐDIK KI, mellékhatásai elmaradnak! 5
logikai vagy feltételes kifejezés <egész kifejezés> <egész kifejezés> Az operandusok balról jobbra értékelődnek ki! Ha az első kifejezés IGAZ, a második NEM ÉRTÉKELŐDIK KI, mellékhatásai elmaradnak! <kifejezés>?<kifejezés>:<kifejezés> Csak az egyik kifejezés értékelődik ki! A kifejezés típusa a kétoperandusú konverzió szabályai szerint határozódik meg! értékadó operátorok (jobbról balra!) = += -= *= /= %= &= ^= = <<= >>= <hivatkozás>=<kifejezés> értékadó operátorok (jobbról balra!) = += -= *= /= %= &= ^= = <<= >>= <hivatkozás><op>=<kifejezés> A hivatkozott változónak módosíthatónak kell lennie! <hivatkozás>=<hivatkozás><op><kifejezés> A hivatkozás csak egyszer értékelődik ki! vessző <kifejezés>,<kifejezés> Az operandusok balról jobbra értékelődnek ki! Az első kifejezés értékét eldobjuk! A kifejezés értéke és típusa a második kifejezés értéke illetve típusa lesz! Ahol a vessző értelme más, zárójelezni kell! Mellékhatások szinkronizálása Sorrend-határ (sequence point): A program végrehajtásának azon pontja, ahol mindenelőzőleg végrehajtott tevékenység mellékhatásának be kell fejeződnie egyetlen későbbi végrehajtandó tevékenység mellékhatása sem kezdődhet el 6
Mellékhatások szinkronizálása Sorrend-határ pontok: utasítás-határ teljes kifejezés kiértékelésének vége vessző operátor függvény aktuális paraméterének meghatározása && és bal operandusa után?: első operandusa után, első operandusa után 7