Akkor most hogy is vannak az operátor-precedencia szintek C/C++ban?
A problémám a következő: ahány precedencia-táblázatot ismerek annyiféle variáció. Persze tudom fordítóprogram függő, de maradjunk GCC-nél.
Kezdjük az elején. A "Computerbooks: Programozzunk C nyelven" című könyv szerint az operátorok precedencia szerint így jönnek nagyság szerint sorrendben (a legelső magasabb mint az utána lévő)
... & ^ | && || ?: ...
A ... természetesen azt jelöli hogy előtte is és utána is vannak további operátorok. A könyv szerint minden operátor külön szinttel rendelkezik.
A "Programozzunk C++ nyelven" című könyv is ezt jelzi, azzal az egy eltéréssel hogy felcseréli a ^ és | jeleket, tehát eszerint a | magasabb rendű mint a ^, viszont a fentebb felsorolt műveletek mindkét könyv szerint más-más precedenciával rendelkeznek (tehát nem egy csoportba tartoznak). És itt bonyolódik a dolog, mert a "A C++ programozási nyelv" könyv (aminek írója a C++ nyelv megalkotója) teljesen egy csoportba veszi a fent felsorolt operátorokat.
Ezen könyv szerint akkor nem precedencia hanem asszociativitás dönt a sorrendről (mivel mindegyik ugyanazzal a szinttel rendelkezik mert egy csoportban vannak). A www.cplusplus.com meg már külön veszi viszont szerinte ^ magasabb mint |.
Kész káosz! Akkor teszteljük le hogy mivan, GCC fordító:
1. sor: 5 ^ 34 | 23 = 55 // alap feltevés csoportosítás nélkül
2. sor: (5 ^ 34) | 23 = 55 // csoportosítás: mivel az eredmény ugyanaz mint az 1. sorban, tudjuk hogy csoportosítás nélkül (1. sor) először a ^ került végrehajtásra
3. sor: 5 ^ (34 | 23) = 50 // előző állítás megerősítése: ha kikényszerítjük hogy először a | kerüljön végrehajtásra más eredményt kapunk
// AZONBAN! itt még nem 100% hogy nem asszociativitásról van szó, így cseréljük fel a tagokat és nézzük hogy hogyan változik a kiértékelés:
4. sor: 23 | (5 ^ 34) = 55 // eredmény ugyanaz mint az 1-2. sorban, nem meglepő a zárójel miatt
5. sor: (23 | 5) ^ 34 = 53 // irreleváns mivel a művelet nem felcserélhető
6. sor: 23 | 5 ^ 34 = 55 // szintén ugyanaz az eredmény, a ^ előbb került kiértékelésre
Ezt dobja ki GCC-vel lefordított exe. C nyelven és C++ nyelven is full ugyanez az eredmény. A végkövetkeztetés viszont abszolút kizárja a C++ alkotójától írt könyvben leírtakat, mivel láthattuk hogy a két operátor nem ugyanolyan szintű. Eszerint a "Programozzunk C++ nyelven" c. könyvben az jól van hogy külön csoportban vannak, viszont épp fordítva: a könyv szerint | értékelődik ki először. A teszteredmények a "Programozzunk C nyelven" könyv és a cplusplus.com adatait támasztják alá, viszont legmegbízhatóbb forrásnak a C++ alkotója által írt könyvet tartom.
1000x bocs h ilyen hosszú lett :S van bárkinek bármi ötlete hogy akkor most hogy van ez?
A leghitelesebb forrás nyilván a Soustroup könyv lenne, ha nem 97-es kiadású lenne és most nem 2013-at írnánk.
Azóta két új szabvány is volt, 2003, és 2011, nyilván változnak a dolgok, szóval a legbiztosabb az cplusplus.com oldal, mivel azt frissítik folyamatosan.
Az operátor precedencia nem változott a szabványok között, ugyanis az rengeteg kódot eltört volna.
Ez a link az igazságot írja le.
Amúgy a C és a C++ között van különbség, ha jól rémlik a ?: operátor precedenciáját változtatták meg.
Kapcsolódó 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!