Programovn v jazyce C Opertory dic struktury pointery

  • Slides: 42
Download presentation
Programování v jazyce C++ Operátory, řídicí struktury, pointery

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

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 – +, -,

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í: – ! – negace • Binární:

Logické operátory • Není typ bool • Uná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.

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í: – ~ –

Bitové operátory • Pracují s operandy na úrovni bitů. • Unární: – ~ – bitová negace. • Binární: – & – bitový součin, – | – bitový součet, – ^ – nonekvivalence (XOR), – <<, >> – bitový posun.

Další operátory • () – závorky • +=, /=, %=, >>=, &=, . .

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

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)

Větvení programu • příkaz if • syntaxe: – if (podmínka) příkaz; – if (podmínka) příkaz 1 else příkaz 2; • 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řepínač • slouží k větvení programu více než dvěma směry, • příkaz switch, •

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’);

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

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: – while (podmínka) příkaz; • např. : – while (getchar()

while cyklus • syntaxe: – 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: – do příkaz while (podmínka); • např. :

do – while cyklus • syntaxe: – do příkaz while (podmínka); • např. : – do i++; while (getchar() == ’ ’);

for cyklus • syntaxe: – for(inicializace; podmínka; iterace) příkaz; • např. – for (i

for cyklus • syntaxe: – 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 +=

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) { c += i; i++; }

Dobré rady do života ; -) • definovat řídící proměnnou v inicializační části cyklu

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

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: – int *p_a; datový typ svázaný s jiným typem,

Pointery • deklarace v C: – 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); printf(”%d”,

Operace s pointery I. • • int a, b, *p_a, *p_b; printf(”%d”, p_a); printf(”%d”, *p_a); printf(”%d”, &p_a); p_a = p_b; *p_a = *p_b; *p_a = a;

Operace s pointery I. • • int a, b, *p_a, *p_b; printf(”%d”, p_a); printf(”%d”,

Operace s pointery I. • • int a, b, *p_a, *p_b; printf(”%d”, p_a); printf(”%d”, *p_a); printf(”%d”, &p_a); p_a = p_b; *p_a = *p_b; *p_a = a;

Operace s pointery II. • • int a, b, *p_a, *p_b; p_a = &a;

Operace s pointery II. • • int a, b, *p_a, *p_b; p_a = &a; &a = p_a; &p_a = &p_b; a = p_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;

Operace s pointery II. • • int a, b, *p_a, *p_b; p_a = &a; &a = p_a; &p_a = &p_b; a = p_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;

Operace s pointery II. • • int a, b, *p_a, *p_b; p_a = &a; &a = p_a; &p_a = &p_b; a = p_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;

Operace s pointery II. • • int a, b, *p_a, *p_b; p_a = &a; &a = p_a; &p_a = &p_b; a = p_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

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}; pole[10];

Statické pole • deklarace v C: – int pole[10] = {1, 2, 3}; pole[10]; pole[] = {1, 2, 3}; 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á

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,

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

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á

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

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 *

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,

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(arg 1, . . . arg. N) hodn, • za jménem nesmí být mezera, • celou hodnotu a jednotlivé argumenty je vhodné (někdy i nutné) ozávorkovat.

Příklady • • • #define c<=’Z’ • #define secti(a, velke(c) b) a + b

Příklady • • • #define c<=’Z’ • #define secti(a, velke(c) b) a + b b) ((a)+(b)) c=>’A’ && 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: – – –

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ží

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

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í

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

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

Použitá literatura Pavel Herout – Učebnice jazyka C, Miroslav Virius – Od C k C++, Slajdy na předmět X 36 PJC z akademického roku 2008/2009 (Ladislav Vágner, Karel Müller), FEL ČVUT, • Slajdy na předmět 36 PJC z akademického roku 2004/2005 (Petr Matyáš), FEL ČVUT, • Server www. builder. cz. • • •