Programování v jazyce C++ Operátory, řídicí struktury, pointery
Přiřazení Např. n = 123; Obecně: l-hodnota = výraz; Přiřazení je výrazem. Příkazem se stává po přidání středníku. Návratovou hodnotou je přiřazovaná hodnota. Lze použít i vícenásobné přiřazení: x = z = y = 5;
Aritmetické operátory Unární operátory +, -, Binární operátory +, -, *, %, / – může být celočíselné i klasické, Speciální unární operátory, ++, --, preinkrement / postinkrement (dekrement).
Logické operátory Není typ bool Unární: Binární: ! – negace Binární: && – konjunkce || – disjunkce Zkrácené vyhodnocování.
Relační operátory Řeší vztah mezi dvěma výrazy. Výsledkem je logická hodnota. Binární: == – rovnost !=, >, <, >=, <= – nerovnost
Bitové operátory Pracují s operandy na úrovni bitů. Unární: Binární: ~ – bitová negace. Binární: & – bitový součin, | – bitový součet, ^ – nonekvivalence (XOR), <<, >> – bitový posun.
Další operátory () – závorky +=, /=, %=, >>=, &=, ... – přiřazovací operátory a += b a = a + b, (typ) – přetypování, sizeof – velikost vyhrazené paměti, , – operátor čárky, ?: – podmíněný výraz.
Priorita operátorů Zdroj: Pavel Herout – Učebnice jazyka C
Větvení programu příkaz if syntaxe: if (podmínka) příkaz; if (podmínka) příkaz1 else příkaz2; jsou-li příkazy if do sebe, váže se else vždy k nejbližšímu if. příkaz musí být vždy ukončen středníkem, zatímco blok nesmí.
Příklady použití if (a >= ’a’ && a <= ’z’) if (a == 1) x if (a = 1) if (a) <=> if (a != 0) if (!a) <=> if (a == 0) if ((c = getchar()) >= ’A’) x if (c = getchar() >= ’A’)
Přepínač slouží k větvení programu více než dvěma směry, příkaz switch, nelze psát prostý výčet hodnot, rozhodovaný výraz nemusí být int, každá větev je ukončena break, je podporována větev default, příkazy v každé větvi není třeba uzavírat do {}.
Použití přepínače switch (getchar()) { case ’a’: case ’b’: case ’c’: putchar (’1’); break; case ’d’: case ’e’: putchar (’3’); break; default: putchar (’4’); break; }
Dobré rady do života ;-) raději než deset příkazů if s jednou rozhodovací proměnnou použijte jeden switch, jak se bude chovat přepínač bez příkazů break? default nemusí být na konci, ale pište ho tam, píšete-li příkazy pod sebe, odsazujte, příkaz break za poslední větví není nutný, ale píše se tam z konvence, pozor, break má i jinou funkci!!
while cyklus syntaxe: např.: testuje podmínku před průchodem cyklem, while (podmínka) příkaz; např.: while (getchar() == ’ ’) i++; testuje podmínku před průchodem cyklem, nedokážeme říci, kolikrát proběhne, tělo cyklu může být i prázdné.
do – while cyklus syntaxe: např.: do příkaz while (podmínka); do i++; while (getchar() == ’ ’);
for cyklus syntaxe: např. jednotlivé části lze vynechat, středníky ne! for(inicializace;podmínka;iterace) příkaz; např. for (i = 1; i < 10; i++) ... jednotlivé části lze vynechat, středníky ne! v jednotlivých částech lze použít více příkazů, ty je pak nutné spojovat operátorem čárka, v rámci iterace může být proměnná měněna libovolným způsobem.
Sémantika for cyklu Mějme tento for cyklus: for (i=1; i<10; i++) c += i; Lze jej nahradit tímto while cyklem: i = 1; while (i<10) { i++; }
Dobré rady do života ;-) definovat řídící proměnnou v inicializační části cyklu lze pouze v jazyce C++, používejte pouze jednu řídící proměnnou, její hodnotu neměňte v těle, častá chyba – středník navíc: for (i = 1; i < 2; i++); x = x + i; lze použít i nekonečný cyklus: for ( ; ; )
Předčasné ukončení cyklu běh cyklu můžeme ukončit i dříve, k tomu nám slouží dva příkazy: break – zcela ukončí běh cyklu, continue – ukončí aktuální průběh cyklu a pokračuje následujícím během téhož cyklu.
Pointery deklarace v C: datový typ svázaný s jiným typem, int *p_a; datový typ svázaný s jiným typem, hodnotou pointeru je adresa, pointery lze nazývat dynamickými proměnnými, na jednom řádku lze definovat statické i dynamické proměnné stejného typu, * je dereferenční operátor, & je referenční operátor, nulový pointer označujeme NULL,
Operace s pointery I. int a, b, *p_a, *p_b; printf(”%d”, p_a); *p_a = a; p_a = a;
Operace s pointery I. int a, b, *p_a, *p_b; printf(”%d”, p_a); *p_a = a; p_a = a;
Operace s pointery II. int a, b, *p_a, *p_b; p_a = &a; &a = p_a; int i, *p_i = &i; int i, *p_i; p_i = &i;
Operace s pointery II. int a, b, *p_a, *p_b; p_a = &a; &a = p_a; int i, *p_i = &i; int i, *p_i; p_i = &i;
Operace s pointery II. int a, b, *p_a, *p_b; p_a = &a; &a = p_a; int i, *p_i = &i; int i, *p_i; p_i = &i;
Operace s pointery II. int a, b, *p_a, *p_b; p_a = &a; &a = p_a; int i, *p_i = &i; int i, *p_i; p_i = &i;
Zásady při práci s pointery nikdy nepřiřazujeme adresu hodnotě a naopak, je slušné označovat pointery prefixem ’p_’, je třeba dát pozor, kdy použít operátor *, kdy operátor & a kdy identifikátor bez operátoru, je-li třeba používejte přetypování pointerů (int *), chcete-li funkci předat nějakou adresu, používejte právě pointery – simuluje se jimi předávání odkazem.
Statické pole deklarace v C: int pole[10] = {1, 2, 3}; int pole[10]; int pole[] = {1, 2, 3}; int pole[]; velikost pole musí být známa v době překladu, statické protože jeho adresa je konstantní.
Přístup k jednotlivým položkám položky jsou číslovány od nuly, maximální položka má tedy index N–1, kde N je velikost pole, sáhneme-li vedle, pod UNIXem program havaruje, Windows to mohou ustát, odkaz na n-tou položku: pole[n-1] , pole v C je pointer - ukazuje na první položku, na tu se lze též odkázat řetězcem *pole.
Pointerová aritmetika pole je homogenní struktura, položky jsou uloženy bezprostředně za sebou, na první (s indexem 0) položku se můžeme odkázat pomocí *pole, n-tá položka je umístěna o právě n pozic dále, díky tomu se lze na něho odkázat takto: *(pole + n) (!= *pole + n) stejně lze provádět i rozdíl pointeru a čísla, porovnání pointerů a rozdíl pointerů.
Pointer jako parametr funkce chceme-li, aby funkce změnila hodnotu proměnné, musíme parametry předat odkazem, jazyk C předávání odkazem nepodporuje, funkce tedy musí mít parametr pointer na daný typ, předáváme-li této funkci statickou proměnnou, musíme ji předat s operátorem &, příkladem takovéto funkce je scanf.
Preprocesor jazyka C je součástí překladače, spouští se před vlastním překladem, zpracovává zdrojový text, vypustí kometáře, provádí záměnu textů, výstupem je opět textový soubor, nekontroluje syntaktickou správnost, příkazy uvozeny znakem ’#’.
Makra bez parametrů definovány pomocí příkazu #define, výraz za #define je dále v textu nahrazen hodnotou uvedenou za ním, nutno oddělit mezerou (v uvozovkách se náhrada neprovede), je-li hodnota delší než 1 řádek, musí být na konci každého (kromě posledního) znak ’\’, konstanta platí do konce souboru, hodnota může obsahovat již definovanou konstantu.
Příklady #define MAX 100 #define PI 3.14 #define DVE_PI (2 * PI) #define MOD % #define OR || #define SOUBOR ”soubor.txt” #define DL_TEXT toto je text,\ ktery se nevejde na jeden radek.
Makra s parametry tzv. in-line funkce, jsou nahrazovány na úrovni zdrojového kódu, nižší režie (viz dále), definice: #define jmeno(arg1, ... argN) hodn, za jménem nesmí být mezera, celou hodnotu a jednotlivé argumenty je vhodné (někdy i nutné) ozávorkovat.
Příklady #define secti(a, b) a + b #define secti(a, b) ((a)+(b)) #define velke(c) c=>’A’ && c<=’Z’ #define velke(c) ((c)=>’A’ && (c)<=’Z’) printf (”%d”, secti(a, b)); if (velke(c))...
Předdefinovaná makra jsou definovány v souboru ctype.h příklady: isalnum, isalpha, iscntrl, isgraph, isdigit, isxdigit, isspace, ispunct, islower, isupper, tolower, toupper.
Podmíněný překlad rozhoduje o tom, zda se daná část kódu přeloží či nepřeloží na základě hodnoty či existence makra, příklad: #if výraz část_1 #else část_2 #endif
Podmíněný překlad II testovat lze pouze hodnoty symbolických konstant, nikoliv proměnných, lze použít též operátor defined #if defined(A) <=> #ifdef(A) #if !defined(A) <=> #ifndef(A) strukturu direktivy #if lze ještě rozšířit o #elif lze použít, nechceme-li překládat část programu.
Další operátory #include <soubor> – vložení syst. souboru, #include ”soubor” – vložení lokálního souboru, #undef – zruší definici makra, #error – vypíše chybovou hlášku během preprocesingu, # – převod argumentu na řetězec – dá do uvozovek, ## – argumenty oddělené tímto operátorem po rozvoji makra vytvoří jeden řetězec.
A to je pro dnešek vše Děkuji za pozornost
Použitá literatura Pavel Herout – Učebnice jazyka C, Miroslav Virius – Od C k C++, Slajdy na předmět X36PJC z akademického roku 2008/2009 (Ladislav Vágner, Karel Müller), FEL ČVUT, Slajdy na předmět 36PJC z akademického roku 2004/2005 (Petr Matyáš), FEL ČVUT, Server www.builder.cz.