Týden 6
Základní (primitivní) datové typy III
Další dvě kategorie typů v jazyce C jsou znakové a reálné typy.
Typ pro znaky se v C označuje klíčovým slovem char. Typ char je celočíselný, znaménkový/neznaménkový, jeho velikost je závislá na architektuře stroje, pro který je program kompilován, a běžně reprezentuje jeden znak v ASCII kódování (http://www.asciitable.com/). Nejnižší a nejvyšší reprezentovatelnou hodnotu udávají makra CHAR_MIN a CHAR_MAX z limits.h.
Stejně jako číselné konstanty, existují i znakové konstanty a zapisují se mezi apostrofy, např. 'a':
char c = '!';
Reálné datové typy jsou vždy se znaménkem a jazyk C nabízí tyto:
- float - reálný typ s poloviční přesností
- double - reálný typ s plnou přesností
- long double - reálný typ se zvýšenou přesností, nemusí být podporován, často je to double
a platí pro ně sizeof(float) <= sizeof(double) <= sizeof(long double). Typy float a double jsou často implementovány podle standardu IEEE 754 - nyní už ISO (http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57469). Typ float je nejčastěji veliký 32 bitů a typ double 64 bitů. Typ long double bývá implementován jako double. Konkrétní vlastnosti reálných typů popisují makra ze souboru float.h - http://www.cplusplus.com/reference/clibrary/cfloat/, např.:
- FLT_DIG - počet číslic, které lze reprezentovat typem float bez zaookrouhlení
- FLT_MIN
- FLT_MAX
Výčtový typ enum
Výčtový typ je vhodný k definici celočíselných konstant. Často konstanty reprezentují námi vytvořený konečný obor hodnot, kterých pak může proměnná nabývat.
Jako příklad mějme semafor - barvy (hodnoty) mohou být červená, oranžová, zelená:
enum semaphore { RED, // 0 ORANGE, // 1 GREEN // 2 }; // definice promenne semaphore sem = RED;
Konstanty jsou reprezentovány celočíselným typem (např. int) - jazyk C neurčuje kterým. Přesný typ je závislý na prostředí (stroj, kompilátor). Konstantám jsou přiřazovány celočíselné hodnoty od nuly po jedné v pořadí v jakém jdou za sebou, pokud není určeno jinak. Hodnoty konstant lze nastavit pomocí operátoru přiřazení (=):
enum little_number { ONE = 1, TWO, // 2 THREE, // 3 FIVE = 5 };
Řídící příkaz switch
Řídící příkaz switch je možné využít, když se chceme v programu "rozhodnout" na základě hodnoty výrazu mezi několika předem danými možnostmi. Představme si např., že chceme napsat program, který načte dvě celá čísla a jeden znak, který bude vyjadřovat, jaká matematická operace se má na číslech provést. Program bychom mohli napsat pomocí if - else, můžeme ale využít také příkazu switch:
int a, b, result; char op; // cast programu, kde se nactou a, b a op switch (op) { case '+': printf("Soucet je: %d", a + b); break; case '-': printf("Rozdil je: %d", a - b); break; case '*': printf("Soucin je: %d", a * b); break; case '/': printf("Podil je: %d", a / b); break; default: // provede se, pokud se nenajde pasujici "case" printf("Neznama operace"); }
Ve skutečnosti se ale příkaz switch chová podobně jako příkaz goto, což může způsobit nemalé problémy při hledání chyb v programu. Za klíčovým slovem switch se provede porovnání proměnné s konstantami v příkazech case. Pokud je vhodný case nalezen, program pokračuje tam. Pokud vhodný case nalezen není, pokračuje program příkazy ve větvi default (pokud je v programu) nebo opustí switch.
Ukončovací příkaz break je za case nejčastěji nutný - pokud chybí, pak program pokračuje dalším řádkem (dalším case). Této vlastnosti je také možné využít ke spojení několika možností do jedné větve:
// cast programu, kde se nacte promenna num switch (num) { case 1: case 2: case 3: printf("Jedna, dve nebo tri"); break; case 5: printf("Pet"); break; default: printf("Jine cislo"); }