A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Agenda Typová konverze Oblast platnosti Paměťové třídy
Typová konverze Řeší situaci, kdy s určitou proměnnou potřebujeme pracovat jako s proměnnou jiného datového typu. Typová konverze je pouze dočasná – tj. je platná pouze pro daný výraz. 2 druhy typové konverze: Implicitní Explicitní
Implicitní typová konverze Probíhá automaticky (bez zásahu programátora). Datový typ s nižší prioritou je automaticky konvertován na datový typ s vyšší prioritou. Př. int x = 5; int y = 2; float z = x + y;
Implicitní typová konverze Priorita datových typů: int unsigned int long unsigned long double long double
Explicitní typová konverze Označována termínem „přetypování“. Požadovaný datový typ se uvede do závorky před identifikátor proměnné. Př. int x = 5; int y = 2; float z = x / (float)y;
Přetypování Přetypování je nutné důkladně uvážit – může totiž ovlivnit správnost výsledku. Příklad: float x = 2.816; int y = 3; int z; z = (int)(x * y); z = (int)x * y;
Oblast platnosti Oblast zdrojového kódu, ve které je daná proměnná viditelná. Oblasti platnosti proměnných: Lokální proměnná Globální proměnná
Oblast platnosti Lokální proměnná: Je definována uvnitř programového bloku (většinou funkce). Je možné k ní přistupovat pouze v rámci bloku, ve kterém byla definována. Není inicializována na výchozí hodnotu (obsahuje náhodné číslo) – nutno ji inicializovat
Oblast platnosti Globální proměnná: Je definována mimo jakoukoliv funkci. Je platná od místa definice až do konce zdrojového souboru. Je inicializována na výchozí nulovou hodnotu
Oblast platnosti - příklad
Paměťové třídy Kromě identifikátoru a datového typu jsou proměnné určeny ještě paměťovou třídou, které náleží. Paměťová třída určuje, kde bude proměnná v paměti uložena, jakou bude mít viditelnost a jakou životnost.
Paměťové třídy Modifikátory: auto extern static register volatile const
Modifikátor auto Implicitně používán pro všechny lokální proměnné, jejichž paměťová třída nebyla určena jiným modifikátorem. Slouží pro vytváření automatických proměnných – paměť se pro ně alokuje až při vstupu do bloku, kde jsou definovány. Po opuštění bloku je tato paměť opět uvolněna.
Modifikátor auto V případě návratu do stejného bloku paměť znovu alokována. Neexistuje záruka, že bude alokována na stejném místě! Neexistuje záruka, že v této paměti bude stejná hodnota, jako na konci předešlého průchodu blokem. Nejsou implicitně inicializovány nulovou hodnotou.
Modifikátor auto Není nutné inicializovat konstantou, možno inicializovat i proměnnou nebo návratovou hodnotou funkce: Př.: auto int x = 5; auto float y = (float)x; auto long z = pow(3,x);
Modifikátor auto Proměnná s modifikátorem auto platí pouze v bloku, kde byla definována. Existuje-li i globální proměnná se stejným názvem, bude použita proměnná s modifikátorem auto
Modifikátor auto - příklad #include int hodnota = 10; int vypocet() { auto int hodnota; hodnota = 15; printf(″%d″,hodnota); return 0; } int main() { vypocet(); printf(″%d″,hodnota); return 0; }
Modifikátor extern Použití při odděleném překladu souborů Říká překladači, že daná proměnná je definována v jiném souboru – zpřístupní se pro daný soubor Namísto definice je tedy použita deklarace proměnné
Modifikátor extern - příklad soubor s1.c: … int hodnota; … Soubor s2.c: … extern int hodnota; …
Modifikátor static Slouží pro vytváření statických proměnných. Viditelnost shodná s automatickou proměnnou (tj. pouze v bloku, kde je definována – mimo tento blok není viditelná, ale na dané paměťové pozici zůstává). Platnost po celou dobu vykonávání programu (tj. při opakovaném průchodu bloku si pamatuje hodnotu).
Modifikátor static #include int funkce() { static int i=0; i = i+2; return i; } int main() { int j; for (j=0; j<10; j++) printf("%d ", funkce()); return 0; }
Modifikátor register Modifikátor, který ovlivňuje optimalizaci kódu programu. Možnost uložit proměnnou přímo do registru procesoru. Použití klíčového slova register pouze doporučuje umístění do registrů procesoru, záleží na překladači a jejich obsazenosti.
Modifikátor register Modifikátor, který ovlivňuje optimalizaci kódu programu. Možnost uložit proměnnou přímo do registru procesoru. Použití klíčového slova register pouze doporučuje umístění do registrů procesoru, záleží na překladači a jejich obsazenosti.
Modifikátor register Možno vytvářet pouze pro lokální proměnné Životnost a viditelnost stejná jako u automatické proměnné. Nemožnost používat operátor reference.
Modifikátor register - příklad #include int main() { register int x = 5; x = x + 1; printf(″%d″,x); return 0; }
Modifikátor volatile Ovlivňuje optimalizaci kódu. Takto označená proměnná nebude optimalizována. Používá se především v případech, kdy hodnota proměnné může být měněna nějakým asynchronním procesem z vnějšku programu, např. pomocí přerušení.
Modifikátor volatile - příklad volatile int i; i=0; while (i==0) ; //smyčku ukončí až vnější událost, která //změní hodnotu i
Modifikátor const Vytváření konstantních proměnných Konstantní proměnná: Nelze ji měnit přiřazením. Hodnotu lze přiřadit pouze inicializací při její definici. Alternativa k symbolickým konstantám (zabírá však místo v paměti). Lze měnit pouze pomocí ukazatelů.
Modifikátor const - příklad #include int main() { const int hodnota = 20; int *ukazatel = &hodnota; //chyba, nelze provést: hodnota=30; printf("%d\n", hodnota); // nepřímá změna hodnoty konst. Proměnné: *ukazatel = 40; printf("%d\n", hodnota); }
A1PRG-s 09. Typová konverze Děkuji za pozornost Ing. Michal Heczko 218/U3 Prezentace k dispozici na