otazky Flashcards
Proč se programy v C rozdělují do hlavičkových souborů (.h) a zdrojových souborů (.c)?
- kvůli přehlednosti - nemusím v každém souboru .c definovat jednu funkci stále znovu, stačí její deklaraci uvést v inkludovaném souboru .h
- kvůli kompilátoru (je třeba dopředu znát deklarace funkcí a jejich návratovou hodnotu)
Jaký význam má hlavičkový soubor zdrojových souborů programu v C?
- jsou v něm popisy funkcí, funkce samotné a také proměnné, které se sdílejí napříč soubory
- hlavičkový soubor je includovaný v mainu (je třeba znát pouze použití, ne jejich přímou implementaci)
Jak probíhá překlad a linkování (sestavení) programu v C?
- preprocesor (dosazuje kusy kódu za includy, # makra, vyhazuje komentáře, spojuje řádky dohromady když tam je /). Pokud chceme spustit pouze fázi preprocessingu, přidáme přepínač -E do kompilace.
- kompilace (kompiluje – převede programátorem napsaný zdrojový kód do spustitelné .o (binární) podoby. To jsou soubory, které již obsahují binární kód. Tento kód ale není spustitelný, protože nemá vyřešené závislosti na jiné části programu (například volání funkce, která je v jiném .c souboru). Je třeba znát deklarace, vkládá jen relativní adresy.
- linkování (vkládají se absolutní hodnoty adres – proměnné a funkce, výsledkem je spustitelný program). Při kompilování do objektových souborů kompilátor neví, zda volaná funkce existuje a kde je. Použití správných adres v paměti řeší linker.
Vysvětlete rozdíl mezi překladem zdrojových souborů a linkováním programu?
- překlad vkládá jen relativní adresy, kdežto linkování vkládá již absolutní adresy
Co je to preprocesor a jaká je jeho funkce při překladu zdrojového souboru v jazyce C?
- počítačový program, který zpracovává vstupní data
- dosazuje kusy kódu a hlídá, jestli nebyl nějaký kus dosazen dvakrát (to
nelze)
Jaké znáte překladače jazyka C?
gcc, clang, tcc, icc
Jak zajistíme, že se hlavičkový soubor programu v C nevloží při překladu vícekrát?
- pomocí tzv. head guard (hlavičkového strážce)
#ifndef PRG #define PRG ...kod #endif
Popište proces vytvoření spustitelného programu ze zdrojových souborů jazyka C.
viz 3.
Jak zajistíte možnost ovlivnit výslednou podobu programu při překladu? Např. Velikost bufferu definovanou symbolickou konstantou?
- přidat přepínač -Dbufsize=1234 ( obecne : -D name=definition ) + v kódu mít něco jako #ifndef bufsize #define bufsize 4321 //vychozi hodnota #endif
Jak při překladu programu kompilátorem GCC nebo Clang rozšíříme seznam prohledávaných adresářů s hlavičkovými soubory?
- I
- gcc -Idir [options ..]
- gcc -Iproj/src myfile.c -o myfile
Záleží u kompilace programu kompilátorem GCC nebo Clang při specifikaci adresářů s hlavičkovými soubory na jejich pořadí?
- ano, např. kdybychom linkovali více knihoven.
Co způsobí definování makra preprocesoru NDEBUG v souvislosti s používáním funkce assert?
- dojde k tomu, že si přestane všímat funkce assert, tudíž program nespadne v pripade nesplneni podminky ve výrazu assert(condition)
Jaký tvar má hlavní funkce programu v C, která se spustí při spuštění programu prostředí s operačním systémem?
int main(){}
int main(int argc, char *argv[]){}
main ( int argc, char **argv ) { // code return 0; // Indicates that everything went well. }
Jakou návratovou hodnotou programu v C indikujete úspěšné vykonání a ukončení programu? Proč zvolíte právě tuto hodnotu?
- return 0;
- nula je jen jedna a také protože to značí 0 chyb
- Je taky možné použít EXIT_SUCCESS a EXIT_FAILURE ktere jsou
definované v stdlib.h
Jak předáváme parametry programu implementovanému v jazyce C?
- argumenty
- pomocí příkazové řádky (zvýší se hodnota argc a zapíše se to do argv pole)
Existuje nějaká jiná možnost jak předat uživatelské parametry programu jinak než jako argument programu?
- ano, například načíst ze standardního vstupu pomocí příkazu scanf (nebo podobných)
Jaký je rozdíl mezi staticky a dynamicky linkovaným programem implementovaným v jazyce C?
- staticky – každá část se zkompiluje samostatně a pak se spojí do jednoho
- dynamicky – operační systém si je zavolá až v momentě, kde je bude potřebovat v tom souboru, nejsou přímo zakompilované v binárce
- staticky linked program = lépe přenosný
Linkují ve výchozím nastavení překladače GCC nebo Clang statické nebo dynamické binární spustitelné soubory?
- standardní knihovny se linkují dynamicky a mé vlastní knihovny staticky
Jak vkládáme do zdrojového souboru programu v C hlavičkové soubory jiných modulů nebo knihoven?
#include (pro standardní knihovny) #include “...” (nejčastěji se používá pro vlastni knihovny)
Jaký rozdíl mezi použitím #include a #include “soubor.h”?
#include #include “hledá jak ve standardních knihovnách, tak u mě ve složce ”
Popište rozdíl mezi deklarací a definicí funkce v jazyce C?
- deklarací pouze řekneme, že zde tato funkce bude (zadáme spolu s parametry) ; Musíme určit jméno funkce, vstupní parametry a návratovou hodnotu.
– definice už je přímo celá funkce – {}
Jak jsou předávány parametry funkci v jazyce C?
- hodnota či reference se zkopíruje na stack (reference – hodnota pointeru) 2 možnosti : Pass by Value a Pass by Reference = neexistuje v cecku, pouze pass by value (pointer = integer s adresou)
Co je to literál a co tímto pojmem označujeme?
int a = 5 –> 5 je literál
Jak lze v jazyce C realizovat předání parametru funkci odkazem?
- ccko je striktně pass by value, takže nijak
- pass by reference jen emulováno pomocí ukazatelů
- Obecně: Ukazatele jsou proměnné, které uchovávají adresu ukazující do paměti počítače, kde je uložená konkretní proměnná.
Jak lze v jazyce C omezit viditelnost funkce pouze v rámci jednoho modulu (souboru .c)?
static názevfunkce
Je možné v jazyce C volat funkci ze sebe sama (rekurze)?
ano
Při volání funkce v jazyce C jsou předávány argumenty funkce, které se stanou lokálními proměnnými. V jaké části paměti jsou tyto lokální proměnné při běhu programu uloženy?
- na stacku
- Stack se používá pro staticky allokovanou paměť -> lokální proměnné, pote co je funkce dokončená, tak je místo vyhrazené pro lokální proměnné uvolněno.
Jaké znáte kategorie proměnných z hlediska jejich umístění v paměti?
- lokální proměnné, argumenty funkce a návratové hodnoty jsou na stacku;
- dynamicky alokované proměnné na heapu;
- globální a statické proměnné na static data (pak případně ještě literály mají
svou paměť)
Je součástí jazyka C přímá podpora (tj. klíčové/á slovo jazyka) dynamická alokace paměti?
- ne přímo v jazyce C, ale v knihovně stdlib.h, která je součástí standardního C
Jak v jazyce C dynamicky alokovat paměť za běhu programu?
- pomocí příkazu malloc() - případně calloc() a realloc() - a free()
int p = malloc(4sizeof(int)); // array of 4 int
Je v jazyce C nutné uvolňovat dynamicky alokovanou paměť? Pokud ano, jak to uděláte?
- ano, pomoci příkazu free()
Jak zjistíme velikost reprezentace datových typů v jazyce C?
- pomocí příkazu sizeof()
Je vždy v jazyce C velikost proměnné typu int 32 bitů?
- ne, závisí na kompilátoru a na počítači
Kdy je velikost ukazatele v jazyce C 32-bitů a kdy 64-bitů?
- závisí na architektuře počítače
- 64-bitový systém by měl používat 64-bitů, 32-bitový 32 bitu apod.
Jak funguje modifikátor static při použití v definici lokální proměnné funkce v jazyce C?
- i po ukončení funkce zůstane proměnná na poslední hodnotě uložená na static data
Jak funguje modifikátor extern při definici globální proměnné v jazyce C?
- tato proměnná bude vidět ve všech modulech
Jaké znáte základní znaménkové celočíselné typy v jazyce C?
- int, long, long long, short
- signed char (-128 až 127)
Rozlišuje jazyk C znaménkové a neznaménkové celočíselné typy? Pokud ano, co z toho plyne?
- ano (unsigned a signed)
- při aritmetice se počítá jen s kladnými čísly
Jaké znáte neceločíselné typy v jazyce C? Jaká je jejich vnitřní reprezentace (velikost)?
- float (32 bit), double (64 bit)
- mantisa a exponent
Jsou v jazyce C definovány rozsahy neceločíselných typů?
- nejsou, jediná podmínka – double musí být 2x větší než float
Jsou v jazyce C definovány rozsahy celočíselných typů?
- liší se podle architektury počítače, ano i ne, pravidla:
short menší než int, int menší než long
Jak v C zajistíte proměnné celočíselného typu s konkrétním požadovaným rozsahem (tj. velikostí datové reprezentace)?
- pomocí uint16_t a dalších
- musí být includovaná knihovna
Je součástí jazyka C typ logické hodnoty ,,true/false’’? Pokud ano, jak se používá? Pokud ne, jak jej definujete?
- ano = “_Bool”, ale radši a bool
Jak v C definujete ukazatel na proměnnou, např. typu int?
int a = 5;
int *b = &a;
Jaké jsou v C omezení pro názvy proměnných a funkcí?
- nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem, délka
Jaké znáte escape sekvence používané v C pro řídicí znaky?
- \n \r \t \v \b \f \a (new line , carriage return, horizontal tab, vertical tab, backspace, form feed, alert)
- \0 = NULL
Jak jsou v C reprezentovány textové řetězce?
- pole charů, které má na konci \0. Pole s řetězcem tedy musí být vždy o 1 delší, než je délka textu, který do něj vkládáme
Jak v C zapisujeme identifikátory (jména funkcí a proměnných)?
- nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem
Jakými dvěma způsoby lze v C vytvářet konstanty?
- definovat je jako macro
- pomocí const
Popište výčtový typ jazyka C. Uveďte vlastnosti, které považujete za důležité?
- enum
- Konstanty výčtového typu jsou vždy celočíselné. Pokud konstantě nepřiřadíte hodnotu, pak má hodnotu o jednotku vyšší, než konstanta předešlá.
- např. leden = 1 .. zbytek se přiřadí sám
Jaké znáte logické operátory jazyka C? Jak se zapisují?
&& (and)
|| (or)
! (negation)
Jaké znáte bitové operátory jazyka C? Jak se zapisují?
>> (logical right shift) << & (logical and) ^ (exclusive or) (XOR) ~ (inverse)(NOT) | (logical or)
Jak v C realizujete dělení a násobení dvěma s využitím operátorů bitového posunu?
- násobení – napr. posunu bitově o dva doleva i«1
- dělení – napr. posunu bitově o dva doprava i»1
Jak v C definujete složený typ (struct)?
struct my_struct_s{
int a;
}
voláme: struct my_struct_s A;
Jak zavedeme nový typ struktury, např. pojmenovaný my_struct_s.
typedef struct { // code } my_struct_s; voláme: my_struct_s A;
Kdy nemusíme psát před identifikátor určující jméno/typ struktury klíčové slovo struct?
- když použijeme typedef
Co je v jazyce C pointerová (ukazatelová) aritmetika a jak se používá?
- jedná se o aritmetiku ukazatelů (tedy proměnných, které ukazují na adresu jiné proměnné)
Jak se v C liší proměnná typu ukazatel a typu pole[] (VLA - pole variabilní délky)?
- pole je ukazatel na první prvek “pole”: int pole[50]; pole je pak ukazatelem na: &pole[0]
- pole[1] = *(pole+1)
Jak v C přistupujeme k datovým položkám složeného typu (struct)?
pomocí tečky (.)
Uveďte příklad přístupu k položkám proměnné složeného typu (struct) a proměnné typu ukazatel na složený typ.
- msg.data
- msg->data
Jaký v C rozdíl mezi typy struct a union?
Struct: - pamět pro každého člena = velikost součet nebo větší všech členů - změna hodnoty neovlivní ostatní čl. - víc inicializací najednou Union: - šetří pamět - jen největší člen - změna hodnoty změní ostatní čl. - přístup jen k jednomu členu v daný čas
Stručně popište typ union používaný v jazyce C.
Union:
- šetří pamět - jen největší člen
- změna hodnoty změní ostatní čl.
- přístup jen k jednomu členu v daný čas
- syntaxe jako struct
Jak se v jazyce C používá operátor přetypování?
- napíšeme před výraz do závorky typ, na který chceme přetypovat (int)promenna
- nelze vždy
Co v C reprezentuje typ void?
- speciální datový typ, kdy se při návratu neposkytuje do volajícího výrazu žádná návratová hodnota
- “žádná data” (datový typ pouze pro organizaci)
Co v C reprezentuje typ void*?
- Deklaruje ukazatel, ale bez zadání typu dat, na který ukazuje. (takže můžeme použít přetypovani jako např. u (int)malloc(…), jelikož malloc taky vrací void)
Jak v C realizujete opuštění dvou nebo více vnořených cyklů z nejvnitřnějšího cyklu?
- horní mez, goto, break, stavy, return, !quit podmínka
Co v C reprezentuje identifikátor NULL?
- jedná se o konstantu, která udává, že pointer je prázdný a že zrovna na nic neukazuje
Jak nastavíte proměnnou typu ukazatel na prokazatelně neplatnou hodnotu?
= 0 anebo = NULL