/ / Prečo inicializácia premennej enumerácie mimo rozsahu mi nedáva upozornenie alebo chybu? - c ++, výpočet

Prečo inicializovať výmennú veličinu mimo rozsah, nedávajte mi upozornenie alebo chybu? - c ++, výčtu

Zvážte kód:

enum spect{violet,indigo,blue,green=8};
spect band = spect (94);

Podľa pravidla limitov vo výpočte by horná hranica bola 2 ^ 4-1 = 15 a nižšia by bola 0 (Ref: C ++ Primer Plus kniha).

ale94>15 tak by mal vydať varovanie alebo chybu. Ale môj program je v poriadku. Prečo?

odpovede:

0 pre odpoveď č. 1

Myslím si, že táto kniha je buď nesprávna, alebo ste mylne vyložili to, čo hovorí o základnom type enumu. C ++ 11 spec hovorí:

§ 7.2

6 Pre výpočet, ktorého základný typ nie jezákladný typ je integrálny typ, ktorý môže predstavujú všetky hodnoty enumerátora definované vo výpočte. Ak žiadny integrálny typ nemôže reprezentovať všetky enumerátor hodnoty, výpočet je zle-formoval. Je definovaný implementačný typ, ktorý sa používa ako základný typ okrem toho, že základný typ nesmie byť väčší ako. \ t int pokiaľ nie je hodnota enumerátor sa nezmestí do int alebo unsigned int, Ak Enumerátor-list je prázdny, základný typ je ako keby výčet mal jeden enumerátor s hodnotou 0.

ďalej:

§ 5.2.9

10 Hodnota integrálneho alebo enumeračného typu môže byťexplicitne prevedená na typ enumerácie. Hodnota je nezmenené, ak je pôvodná hodnota v rozsahu hodnôt enumerácie (7.2). V opačnom prípade hodnota nie je špecifikovaná (a nemusí byť v tomto rozsahu). Hodnota typu s plávajúcou desatinnou čiarkou môže byť tiež konvertovaná typu enumerácie. Výsledná hodnota je rovnaká ako konverzia pôvodnej hodnoty na podklad typu enumerácie (4.9) a následne typu enumerácie.

Myslím, že kniha sa môže snažiť vysvetliť túto doložku:

§ 7.2

7 Pre enumeráciu, ktorej základný typ je fixný, sú hodnoty enumerácie hodnotami základný typ. V opačnom prípade pre výpočet, kde emin je najmenší enumerátor a emax je najväčšie, hodnoty enumerácie sú hodnoty v rozsahu bmin na bmax, definované nasledovne: Nechajme K 1 pre reprezentáciu dvoch doplnkov a 0 pre reprezentáciu komplementu alebo znak-veľkosť. bmax je najmenšia hodnota väčšia alebo rovná max(|emin| - K,emax</ Em>|) a rovná sa 2M - 1, kde M je nezáporné celé číslo. bmin je nula, ak emin je nezáporné a - (bmax + K) inak. Veľkosť najmenšie bitové pole, ktoré je dostatočne veľké na uloženie všetkých hodnôt typu enumerácie max(M, 1) ak bmin je nula a M + 1 inak. Je možné definovať výčet, ktorý má hodnoty, ktoré nie sú definované žiadnym z nich komisári. Ak je Enumerátor-list je prázdny, hodnoty enumerácie sú ako keby výčet mal a jednoduchý enumerátor s hodnotou 0.