C++ Kérdések az operátorokról és a precedenciáról?
Lenne néhány kérdésem az operátorokról és a precedenciáról, főleg az érdekelne hogy jól értek-e a dolgokat.
1. Számos tankönyv úgy magyarázza, hogy a precedencia az ami meghatározza a kifejezések kiértékelési sorrendjét. Az már világos hogy ez így nem helyes, a precedencia elsőbbségi rangsort jelent a kifejezésfa felépítésekor, igaz?
"Expressions with higher-precedence operators are evaluated first."
2. Ennek következménye, hogy a precedencia a kifejezések értékének MEGJELENÉSI sorrendjét határozza meg, ugye?
3. Angol irodalomban (pl szabvány, draft) a kiértékelés? "evaluation", a kif. értékének megjelenése pedig "computation" ?
4. A C++ szabvány pontosan mit mond ki a precedenciáról?
Az 5.-ös fejezet (Expressions) megadja a precedencia alapján vett rangsort?
5. Az elsődleges operátorok (primary expressions) lényege hogy ha a fordító találkozik egy ilyen kifejezéssel, akkor azt ki kell értékelni. Az előző kérdésem függvényében, az elsődleges operátoroknak van a legnagyobb precedenciája? (hiszen a szabvány az 5-ös fejezetben elsőként hozza fel).
Megköszönném ha segítenétek, üdv
én például azt sem értem, hogy akkor most mi a kérdés
kezdjük ott, hogy az expression az kifejezés, nem operátor
1. A kifejezések kiértékelési sorrendje valóban nagyrészt független a precedenciától, de ugye egy kifejezést csak akkor tudsz kiértékelni, ha minden részkifejezését már kiértékelted.
Jól mondod, ha például van egy a + b * c kifejezés, akkor a precedencia azt mondja meg, hogy a kifejezésfa gyökere a + lesz és a jobb oldali alkifejezés a b * c-ből jövő fa. De hogy a, b, vagy c értékelődik ki előbb arról nem mond semmit.
"Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified."
2. Nem is értem, mit mondasz.
3. 4. Fogalmam sincs, nem mentem bele ennyire nyelvtani szempontból a nyelvbe.
5. Na most a fordító nem értékel ki semmit, max a constexpr függvényeket meg a literálok közötti műveleteket (tehát az 5 + 2-t ki fogja értékelni, az x + 5-t nem).
Azt nem tudom, hogy definíció szerint nekik van-e a legnagyobb precedenciájuk, de működésileg igen, mindig ők vannak a szintaxisfa leveleiben.
1. Köszönöm, világos
2. Matematikából tudjuk hogy a szorzás magasabb rendű mint az összeadás, azért azt előbb el kell végezni, előbb ki kell értékelni. Programozásban ezt a kifejezést szándékosan kerülöm hogy "kiértékelni", hiszen a precedencia nem azt adja meg. Akkor úgy fogalmazom meg: A precedencia gyakorlatilag a matematikai értelemben vett "rendűséget" jelenti?
3-4. Ezt azért kérdezem, mert a szabványban amit linkeltem, olvastam amit te is belinkeltél az oké, csak az 5-ös fejezet 1. pontja számomra nem egyértelmű:
"[Note: Clause 5 defines the syntax, order of evaluation, and meaning of expressions."
Ebből nekem az jön le, hogy az 5-ös fejezetben történő felsorolás jelenti a kiértékelési sorrendet (order of evaluation ??) ill. ha a kiértékelési sorrendet nyilván nem, de a precedencia sorrendet igen.
5. Akkor helyesbítek: nem fordító hanem rendszer, amikor a C++ programot futtatják. Nekem úgy tűnik logikusnak hogy definíció szerint is, mert elsőként őket hozza a szabvány.
Nagyon köszönöm a segítséged, üdv
Az operátorokat képzeld el függvényhívásként.
Így egy két operandusú operator:
(a _op1_ b)
Írható így is
_op1_(a, b)
A precedencia azt dönti el, hogy egy összetettebb kifejezés hogy bomlik ilyen "függvényhívásokra", azaz
(a _op1_ b _op2_ c)
az valójában
_op1_( a, (b _op2_c) )
vagy
_op2_( (a _op1_ b), c)
a kifejezés feloldása
Ez egy kifejezésen belül érvényes. Tekintsd ebből a szempontból kifejezésnek, ami zárójelben van, vagy zárójelbe rakható anélkül hogy értelme megváltozna.
Persze a,b,c is kifejezések.
Az azonos precedenciájú operatorok között pedig asszociativitás dönt (tehát többnyire balról jobbra)
Ha meg már átírtad függvényes formára, egyértelmű a kiértékelés sorrendje.
"Ha meg már átírtad függvényes formára, egyértelmű a kiértékelés sorrendje."
Persze ez pont nem igaz, a függvényparaméterek az egyik legjobb példa arra, hogy a C++ nem írja elő a kiértékelési sorrendet.
Igaz, nem jól fogalmaztam :)
Az látszik mit mi előtt kell kiértékelni, tehát a precedencia.
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!