Kezdőoldal » Számítástechnika » Programozás » Akkor most hogy is vannak az...

Akkor most hogy is vannak az operátor-precedencia szintek C/C++ban?

Figyelt kérdés

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?


2013. jan. 20. 01:38
 1/5 anonim ***** válasza:

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.

2013. jan. 20. 02:33
Hasznos számodra ez a válasz?
 2/5 A kérdező kommentje:
Oké nagyon köszönöm a választ. Már csak az érdekel, ez a két új szabvány amiről beszélsz, GCC ugye?
2013. jan. 20. 08:41
 3/5 anonim ***** válasza:
Szerintem C++ szabványra gondolt. A GCC egy program, nem egy szabvány. A GCC-ben implementálták a C++ szabványokat (ill egy részüket).
2013. jan. 20. 09:27
Hasznos számodra ez a válasz?
 4/5 A kérdező kommentje:
Igen énis kb erre gondoltam, köszönöm a választ.
2013. jan. 20. 09:39
 5/5 iostream ***** válasza:

Az operátor precedencia nem változott a szabványok között, ugyanis az rengeteg kódot eltört volna.


[link]

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.

2013. jan. 20. 11:00
Hasznos számodra ez a válasz?

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

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!