| ← překladače | C/C++ | datové typy → |
Vše o vzniku programu již bylo objasněno a tak se můžeme věnovat čistě jen syntaxi jazyka C. V této kapitole si na prvním jednoduchém příkladě osvětlíme velkou spoustu nových věcí. Některé z nich se budou probírat později podrobněji. Pokud pochopíte věci vysvětlované v této kapitole, již se můžete začít považovat za programátory amatéry :-).
Správně bych měl říkat první zdrojový kód, ale myslím, že říkat
"program" není zase tak velký prohřešek. Tak mě za to nekamenujte.
Však vy si z toho zdrojového kódu program vytvoříte.
Podívejme se tedy na něj.
Následující kód můžete uložit do souboru s příponou .c
(např. kod.c). Přípona .c je pro některé překladače (zvláště v
Linuxu) povinná, někdy však ne a soubor se může jmenovat libovolně.
Nevidím však jediný rozumný důvod, proč jí nepoužít. Ve jménech
souboru nepoužívejte českou diakritiku ani mezery!
1: /*------------------------------------------------*/ 2: /* kod.c */ 4: /* Toto je libovolny komentar 5: * v souboru kod.c */ 7: #include <stdio.h> //standardni knihovna 9: int main(void) 10: { 11: printf("Hello World\n"); 12: return 0; 13: } 15: /*------------------------------------------------*/
Čísla na začátku řádků nejsou součástí zdrojového kódu. Budu je však uvádět před každým zdrojovým kódem, abych se na ně mohl v textu odkazovat.
Všimněte si mezer, odsazování a konců řádků ve zdrojovém kódu a vůbec celkové úpravy. Bílé znaky, jako je mezera, tabulátor nebo znak nového řádku většinou ve zdrojovém kódu jazyka C nemají žádný význam. Odsazováním program pouze získá na přehlednosti a čitelnosti. Funkci main() by jste mohli napsat do jednoho řádku, to je překladači jedno.
int main(void) { printf("Hello World\n"); return 0;}
Posuďte sami, co je přehlednější. Konce řádků jsou důležité pouze pro direktivy začínající znakem # (čti „šarp“) a u komentářů začínajících dvěma lomítky, protože jejich konec je dán právě koncem řádku.
Tím nejjednodušším, co je v programu vidět, jsou komentáře. Vše co je mezi znaky /* a */ je komentář. V jazyce C++ se navíc považuje za komentář vše za dvěma lomítky // až do konce řádku. Většina moderních překladačů C také rozezná dvě lomítka jako komentář (mnohdy je překladač C a C++ jeden a ten samý program). Až budete dělat větší programy, uvidíte jak je dobré mít správně okomentovaný zdrojový kód. Dobré komentáře vám pomohou se v kódu orientovat. Je dobré poznamenávat takové věci, jako třeba ... toto číslo musí být nezáporné z toho a toho důvodu ... . Při změně programu v budoucnosti se tím vyvarujete chyb.
Existují takzvané standardní knihovny, což jsou knihovny dodávané s
překladačem, a uživatelské knihovny, které si vytváří programátor
sám. Hlavičkové soubory jsou soubory, v nichž jsou
uloženy definice funkcí
z knihovny.
Jejich přípona je většinou .h, ale není povinná (stejně jako .c).
Pro C++ se někdy knihovny označují příponou .hpp.
Direktiva #include říká překladači, jaký hlavičkový soubor má načíst před překladem zdrojového kódu. Pokud je jméno v takovýchto špičatých závorkách < >, pak se soubor hledá ve standardních adresářích. Které to jsou, to záleží na překladači.
Standardní knihovna stdio (která obsahuje
funkci printf()) je tak notoricky používána,
že mnohé překladače ani nevyžadují uvední direktivy #include <stdio.h>. Přesto, v zájmu
kompatibility, tuto direktivu používejte (pokud jí potřebujete).
stdio = standard input output
(knihovna pro standardní vstup a výstup)
Jména uživatelských hlavičkových souborů jsou uzavřeny ve dvojitých uvozovkách a hledají se v aktuálním adresáři. Například #include "kkk/knihovna.h" je soubor se jménem knihovna.h v podadresáři kkk/ aktuálního adresáře. Jak si vytvořit vlastní hlavičkový soubor se naučíme později. Nejdříve se budeme seznamovat se standardními knihovnami a funkcemi.
V našem příkladě máme v programu dvě funkce. Funkci main() a funkci printf(). Funkci main() definujeme. To znamená, že popisujeme co tato funkce bude dělat. Funkci printf() pouze „voláme“, tj. chceme po ní, aby udělala to, co je dáno její definicí. Je to funkce definovaná v knihovně stdio.h a její definice způsobý vypsání textu.
Funkce má své jméno (main), návratovou hodnotu (int) a argumenty určené v závorkách za jménem funkce ((void)). Návratová hodnota určuje, jaká data funkce vrátí při svém skončení (např. int je celočíselná hodnota). K čemu to je, to se dozvíte později. Argumenty jsou pro změnu data, která funkce dostává ke zpracování. Hodnota void znamená „nic“, v našem případě to znamená, že funkce main() žádné argumenty neočekává. Návratová hodnota je jen jedna a její typ se píše před jméno funkce. Argumenty se píší za jméno funkce do závorek a je-li jích více, oddělují se čárkou. Funkce printf() dostává jako argument řetězec (řetězce jsou vždy ve dvojitých uvozovkách). Znaky \n reprezentují nový řádek (ENTER, chcete-li).
Tělo funkce je všechno to, co je ve špičatých závorkách { }. Funkce se ukončuje klíčovým slovem return za kterým je návratová hodnota funkce.
Funkce jsou poměrně složitou záležitostí a budeme se jim věnovat později podrobněji. Důležité je vědět, že funkce main() je speciální funkce, která je volána1) v programu jako první. Ve funkci main() pak můžete volat další funkce, dle libosti. Z toho také vyplývá, že funkci main musí mít každý program, jinak by překladač nevěděl čím začít při provádění programu. Funkce main() má vždy návratovou hodnotu typu int (celé číslo).
Z toho přísunu nových informací můžete být dost zmateni. Hlavně proto, že jsem u spousty věcí říkal, že je probereme podrobněji později). Pokud jste se prokousali až sem, pak již máte vyhráno. Už víte jak udělat program v jazyce C. Nejdříve začnete funkcí main(), protože ta se volá v programu jako první. Přidáte knihovny pomocí #include, aby jste mohli používat v nich nadefinované funkce a ty pak voláte ve funkci main(). Funkce main() skončí příkazem return. Pokud by jste jej neuvedli, pravděpodobně by jste program také přeložili, ale překladač by vás na tuto chybu upozornil varováním. Stejně tak by bylo odpustitelnou chybou, kdyby jste za jménem funkce main() do závorek nenapsali void ale nechali je prázdné. Překladač by si „void“ domyslel sám. Funkce main() může být buďto bez argumentů, nebo se dvěma speciálními argumenty, o kterých si ale povíme později :-).
Na závěr si ukážeme ještě jeden program a další využití funkce printf(). Funkce printf() má jako první argument textový řetězec. Ten může obsahovat speciální sekvence. Už jsme se s jednou setkali. Sekvence \n přesune kursor na nový řádek. Funkci printf(). si později vysvětlíme systematičtěji i se všemi speciálními znaky. Teď vám chci ukázat ještě dva, které se nám budou při výkladu hodit. První je %s. Za tento znak se dosadí textový řetězec, který je dalším argumentem funkce printf(). Druhý je %i, za který se dosadí celé číslo. Prostudujte si následující program a zkuste napsat vlastní.
1: /*------------------------------------------------*/ 2: /* kod2.c */ 4: #include <stdio.h> 6: int main(void) 7: { 8: printf("1 + 1 = %i\n", 1 + 1); 9: printf("%i + %i = %i\n", 1, -2, 1 + (-2)); 10: printf("%s\n", "Konec programu."); 11: /* return ukonci program. */ 12: return 0; 13: printf("Tohle se uz nezobrazi %s!\n"); 14: } 16: /*------------------------------------------------*/
Všimněte si posledního volání funkce printf(). Je až za příkazem return a proto k jejímu volání v programu ani nedojde. Navíc obsahuje chybu. V řetězci je %s ale funkce nemá žádný další argument. Pokud by tato funkce byla volána, „sáhla“ by si kamsi do paměti pro neexistující řetězec. Buď by se vytiskly nějaké nesmysly, nebo by program skončil s chybou (neoprávněný přístup do paměti; program provedl nepovolenou operaci atp.). Takže si na to dávejte pozor. Na tuto chybu vás překladač nemusí upozornit, protože překladač zkontroluje jen to, že funkce printf() má mít jako první argument textový řetězec (a to má). Jelikož je tato chyba opravdu častá (a taky dost nebezpečná), dokáží moderní překladače tyto chyby odhalit, ale mnohdy se o to musí „požádat“ nějakým nastavením.
A to je pro dnešek vše. Přečtěte si tuto kapitolu tolikrát, kolikrát bude potřeba, aby jste zdrojový kód kod2.c celý pochopili. Zvykněte si taky na pojmy „volání funkce“, „definice funkce“, „argumenty funkce“ a „návratová hodnota funkce“. Určete všechny části zdrojového kódu, které se k těmto pojmům vztahují.
1) „Voláním funkce“ se myslí provedení příkazů, které funkce obsahuje.
| ← překladače | C/C++ | datové typy → |
