Kezdőoldal » Számítástechnika » Programozás » C/C++ kérdés az operátorokról?

C/C++ kérdés az operátorokról?

Figyelt kérdés

Brian Kernighan és Dennis Ritchie: A C programozási nyelv c. könyve:


"A

() [] . ->

elsődleges kifejezés operátorok prioritása a legmagasabb, és az ilyen operátorok balról jobbra kötnek."


"Prioritás" alatt precedenciát ért? Vagyis ez elsődleges kif. precedenciája a legmagasabb C-ben.


C++ban viszont nem, ezt Stack Overflow-ról tudom:


[link]


"And "primary expression" doesn't neccesarily mean it gets evaluated first."


Akkor ez most azt jelenti hogy ez C-ben így van, de C++ban nem? Vagy mást értek félre?


Megköszönném ha segítenétek, üdv


2013. aug. 4. 16:30
 1/8 anonim ***** válasza:

értem én a kérdést de könyörgöm, olvass már tovább a linkelt oldalon


ugyanazt a hibát követed el, mint az ott kérdező fazon

2013. aug. 4. 17:20
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:
Nem lehetne inkább hogy értelmesen válaszolj? Elolvastam, de nem vagyok profi angolos hogy 100%ig értsem.
2013. aug. 4. 17:25
 3/8 A kérdező kommentje:
Arra célzol, hogy az adott kifejezés kiértékelése nem definiált, de hogy az értéke mikor jelenik meg igen? Légyszíves ha tudod a választ segíts, nem vagyok angol guru.
2013. aug. 4. 18:02
 4/8 iostream ***** válasza:

Pedig nagyon jól leírja a stackoverflow-s srác.

A precedenciának semmi köze a kiértékelési sorrendhez. Az azt mondja meg, hogy hogy építse föl a kifejezésfát.


1 + 2 * 3

Itt a * precedenciája nagyobb, tehát így fog kinézni a fa:

+_-_1

__-_*_-_2

______-_3


Jó olvashatatlan, de mindegy is. Itt ha az 1, 2 és 3 közül valamelyik nem literál hanem mondjuk egy "elsődleges kifejezés", akkor ki kell őket értékelni, na és ez teljesen definiálatlan, hogy milyen sorrendben történik meg, független a precedenciától.


variable + (1 + variable2) * ojjektum.x

Itt csak azt tudjuk, hogy a () és a x.y értéke csak akkor van meg, ha a részkifejezés (az "1 + variable2" és a "ojjektum.x") megvan. Az ojjektum maga is lehetne bármilyen elsődleges kifejezés, akár egy zárójelezett bonyolult darab, ami végül egy objektum értékét vagy referenciáját adja.



Tehát mégegyszer: a prioritásnak (precedenciának) semmi köze a kiértékelés sorrendjéhez.

2013. aug. 5. 10:13
Hasznos számodra ez a válasz?
 5/8 A kérdező kommentje:

Nagyon-nagyon köszönöm iostream!


"Tehát mégegyszer: a prioritásnak (precedenciának) semmi köze a kiértékelés sorrendjéhez."


Ez halál komoly? Programozzunk C nyelven könyv:


"Annak érdekében, hogy bonyolultabb kifejezéseket is helyesen tudjunk használni, meg kell ismerkednünk az elsőbbségi (precedencia) szabályokkal, amelyek meghatározzák a kifejezésekben szereplő műveletek kiértékelési sorrendjét."


"Az operátorok precedenciája akkor játszik szerepet a kifejezés kiértékelése során, ha a kifejezésekben különböző precedenciájú műveletek szerepelnek. Ekkor mindig a magasabb precedenciával rendelkező operátort tartalmazó részkifejezés kerül először kiértékelésre, amit az alacsonyabb precedenciájú műveletek végrehajtása követ."


A precedencia és kifejezésfáról most hallok először: [link]



Most ha jól értem van az hogy "kiértékelni egy kifejezést" azt jelenti hogy kiszámolja a rendszer az értékét, de a kifejezésben az még nem feltétlenül jelenik meg?


Amikor a kifejezés értelmezésre kerül, akkor tehát lesz egy hozzá tartozó kifejezésfa. Ez már tiszta. A kifejezésfa kiértékelésénél az definiált hogy melyik levél-elemtől kezdődik a kiértékelés (pl szisztematikus sorrendben), vagy implementációfüggő?


Mégegyszer nagyon köszönöm a segítségedet. Üdv

2013. aug. 5. 11:27
 6/8 A kérdező kommentje:
???
2013. aug. 6. 17:20
 7/8 iostream ***** válasza:

Na, legalább érted, mi az a kifejezésfa. Vannak függőségek értelemszerűen: egy összeadás kiértékeléséhez ki kell értékelni mindkét oldalát. A fenti példában persze a szorzás előbb végződik el, mint az összeadás. De ez triviális a kifejezés szemszögéből, hiszen az összeadásnak RÉSZkifejezése a szorzás (mivel magasabb a precedenciája). Viszont ezeken a függőségeken kívül nincs követelmény, ahogy mondod, a levelek kiértékelési sorrendje implementációfüggő. És ha egy részfa a gyökerén kívül teljesen ki van értékelve, akkor ugye az is "levéllé válik" ebből a szempontból.


Van ugye a híres példa a mellékhatással járó kifejezésekre:

int a[] = {0, 1};

int i(0);

a[i] = i++;

Az biztos, hogy 0 íródik be. Na de hova?

2013. aug. 6. 17:49
Hasznos számodra ez a válasz?
 8/8 A kérdező kommentje:
Akkor most már mindent értek, végre összeállt a kép. Nagyon köszönöm iostream!
2013. aug. 7. 08:20

További kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!