Týden 5
Základní (primitivní) datové typy II
Datové typy jazyka C jsou závislé na architektuře počítače, na které je program kompilován. Velikost datového typu v bytech je možné zjistit pomocí operátoru sizeof() - např. velikost typu int se zjistí jako sizeof(int).
Typy v jazyce C se dají rozdělit na tři kategorie: znaky, celočíselné a reálné.
Celočíselné datové typy jsou:
- short int - nebo jen short
- int
- long int - nebo jen long
- long long int - nebo jen long long
a platí pro ně sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long). Velikost typu int by měla být zvolena kompilátorem tak, aby na cílovém procesu byly matematické operace co nejefektivnější.
Všechny celočíselné datové typy mohou být buď se znaménkové nebo bez reprezentace znaménka, např. signed int nebo unsigned int. Pokud neuvedeme jinak jsou celočíselné typy znaménkové.
Minimální a maximální hodnoty, které lze celočíselnými typy reprezentovat jsou dostupné jako makra v hlavičkovém souboru limits.h - http://www.cplusplus.com/reference/clibrary/climits/, např.:
- INT_MIN
- INT_MAX
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 = '!';
Řídící příkazy break, continue a goto
Příkazy break a continue se je možné užít k řízení cyklů. Příkaz break ukončí celý cyklus, kdežto příkaz continue ukončí momentální průchod cyklem a pokračuje na podmínku cyklu.
Příklad užití je zde:
int oddCount = 0; for (int i = 0; i < 10; i++) { // vyzkousej 10-krat int x; scanf("%d", &x); if (x < 0) { // odejdi z cyklu pokud bude x zaporne break; } else if (x % 2 == 0) { // x je sude, dalsi pokus continue; } // Spocitej vsechna kladna licha cisla oddCount++; }
Příkaz goto je možné užít k řízení programu kdekoliv. Důrazně doporučuji se užití příkazu goto vyhnout, program lze vždy napsat i jinak - pomocí větví a cyklů.
Ří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"); }