Výrazy, operace, příkazy

Podobné dokumenty
Výrazy, operace, příkazy

Data, výrazy, příkazy

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Úvod do programovacích jazyků (Java)

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programovací jazyk C++ Hodina 1

Racionální čísla, operátory, výrazy, knihovní funkce

Zápis programu v jazyce C#

Úvod do programování. Lekce 1

Algoritmizace a programování

Programovací jazyk Pascal

Paměť počítače. alg2 1

Racionální čísla, operátory, výrazy, knihovní funkce

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

5 Přehled operátorů, příkazy, přetypování

Jazyk C# a platforma.net

Opakování programování

Ukazatele, dynamická alokace

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Odvozené a strukturované typy dat

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Ukazka knihy z internetoveho knihkupectvi

Algoritmizace a programování

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Prezentace a vysvětlení programového prostředí NXC

Programování v jazyce JavaScript

Programování v C++ 1, 1. cvičení

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Programování v C++, 2. cvičení

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Jazyk C++, některá rozšíření oproti C

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Základy C++ I. Jan Hnilica Počítačové modelování 18

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Řídicí struktury. alg3 1

7. Datové typy v Javě

Reprezentace dat v informačních systémech. Jaroslav Šmarda

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

NPRG031 Programování II --- 2/2 Z, Zk

Algoritmizace a programování

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Struktura programu, proměnné, konstanty, výrazy v jazycích C a C#

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Formátové specifikace formátovací řetězce

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Struktury, funkce, reference

PROGRAMOVÁNÍ V C++ CVIČENÍ

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Základy programování (IZP)

ADT/ADS = abstraktní datové typy / struktury

Datové typy pro reálná čísla

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

IUJCE 07/08 Přednáška č. 1

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

6. Příkazy a řídící struktury v Javě

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Objektově orientované programování

Java reprezentace dat, výrazy. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

Úvod do programovacích jazyků (Java)

Programování v jazyce JavaScript

Datové typy strana 29

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Operátory. Základy programování 1 Tomáš Kühr

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

PB161 Programování v jazyce C++ Přednáška 10

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Programování C++ Lukáš Tomášek. verze

PŘETĚŽOVÁNÍ OPERÁTORŮ

Úvod do programování - Java. Cvičení č.4

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Základy programování (IZP)

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

KTE / ZPE Informační technologie

PHP - úvod. Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky.

IUJCE Přednáška č. 1. programování v C na vyšší úrovni základy objektově orientovaného programovaní v (C++, C#)

Základy jazyka C. Základy programování 1 Tomáš Kühr

přetížení operátorů (o)

Třídy a struktury v C++

Transkript:

Výrazy, operace, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 02/2016, Lekce 2 https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start

Základní datové typy celočíselné typy: char (nejmenší adresovatelná buňka) char, unsigned char, signed char int (šířka je závislá na procesoru a systému) short = short int = signed short = signed short int int = signed = signed int unsigned = unsigned int long = long int = signed long = signed long int unsigned long = unsigned long int long long = long long int unsigned long long = unsigned long long int short <= int <= long s pohyblivou řádovou čárkou: float, double, long double logické hodnoty (chybí v C): true, false void typ s prázdnou množinou hodnot 2

Základní datové typy: příklad reprezentace Vnitřní reprezentace skalárních typů na PC celočíselné typy (reprezentace v pevné řádové čárce) v doplňkovém kódu se znaménkem reálné typy (reprezentace v pohyblivé řádové čárce) podle normy IEC 60559:1989 (ANSI/IEEE) Velikost vnitřní reprezentace: Clang++3.3, VC++ 12 64bit Linux 64bit char, signed char, unsigned char 1B 1B short, unsigned short 2B 2B int, unsigned int 4B 4B long, unsigned long 8B 4B long long, unsigned long long 8B 8B float 4B 4B double 8B 8B long double 16B 8B Platforma I32LP64 IL32P64 I32LP64: Integer má 32 bitů, Long a Pointer mají 64 bitů 3

Jak zjistit velikost datového typu? #include <iostream> int main() { std::cout << "char: " << sizeof(char) << '\n' << "short: " << sizeof(short) << '\n' << "int: " << sizeof(int) << '\n' << "long: " << sizeof(long) << '\n' << "long long: " << sizeof(long long) << '\n' << "float: " << sizeof(float) << '\n' << "double: " << sizeof(double) << '\n' << "long double: " << sizeof(long double) << '\n'; } 4

Popis jazyka Popis syntaxe (jak se to píše) Popis sémantiky (co to znamená) Standardní knihovny (standardní služby, které musí každá implementace jazyka poskytovat základ přenositelnosti programů) Popis syntaxe a sémantiky je uspořádán takto: popis použité paměti (deklarace) popis výpočtů prováděných nad pamětí (výrazy) popis posloupnosti provádění výpočtů (příkazy) 5

Lexikální elementy identifikátory písmena (rozlišuje se velikost), číslice, podtržítko délka není omezena, rozlišují se podle úvodních znaků v závislosti na implementaci (ANSI doporučuje nejméně 31 znaků) některé jsou rezervovány jako klíčová slova klíčová slova if, while... oddělovače a operátory { } ; + - & && <<= číselné literály (zápisy čísel) 125 1'234'567'893'234 125.45e-7 0.12E3 oktalové: 037 hexadecimální: 0x1F binární: 0b101011 6

Lexikální elementy (pokračování) literály řetězců "abcd" "" "xyz\nabc" vnitřní reprezentace: posloupnost znaků zakončená binární nulou '\0' 'a' 'b' 'c' 'd''\0' 'x' 'y' 'z''\n''a' 'b' 'c''\0' znakové literály (zápisy znaků) 'x' '\n' '\t' '\0' '\\' '\'' '\014' '\u010c' wchar_t c = L'\u79c1'; // Unicode řetězec const char* str = "\xec\xa4\x91"; //řetězec s UTF-8 znakem komentáře /* toto je komentář */ // toto je komentář v C++ a v novějších normách C (C99+) 7

Deklarace proměnné paměťová třída kvalifikátor specifikace typu seznam deklarátorů ; Příklady: int n; const int x = 2; extern pole[10]; static long double z; 8

Deklarace proměnné: paměťová třída paměťová třída kvalifikátor specifikace typu seznam deklarátorů ; Paměťová třída popisuje způsob přidělování paměti: (nic) dle kontextu (viz. níže) static paměť přidělena staticky během překladu extern nepřidělovat paměť Implicitně je paměťová třída: automatická (ve funkcích, v bloku) nebo static (v modulu, globální proměnné) Automatické proměnné jsou alokovány na zásobníku, statické zpravidla v datovém segmentu programu. Statické existují po celou dobu výpočtu, automatické jen po dobu zpracování bloku, ve kterém jsou lokální. 9

Deklarace proměnné: kvalifikátor paměťová třída kvalifikátor specifikace typu seznam deklarátorů ; Kvalifikátor popisuje další požadované vlastnosti: const volatile mutable extern const int Max; Max = 10;/* chyba */ volatile int regs; konstantní objekt objekt, který je sdílen s jiným nezávislým procesem vzácné, třídní proměnné které mohou být modifikovány na const objektu 10

Deklarace proměnné: specifikace typu paměťová třída kvalifikátor specifikace typu seznam deklarátorů ; Specifikace typu je: void zastupuje žádný typ (má prázdnou množinu hodnot) identifikátor typu (základního nebo uživatelem definovaného) popis struktury (struct), popis třídy (class), popis sjednocení (union), nebo výčtového typu (enum) auto typ je doplněn kompilátorem jako typ na pravé straně výrazu 11

Deklarace proměnné: seznam deklarátorů paměťová třída kvalifikátor specifikace typu seznam deklarátorů ; Seznam deklarátorů je výčet deklarátorů oddělený čárkami. Deklarátor má syntaxi: identifikátor * deklarátor ukazatel deklarátor [ konstantní výraz ] pole deklarátor ( parametry ) funkce ( deklarátor ) Pozn.: za * může být kvalifikátor. 12

Deklarace proměnné paměťová třída kvalifikátor specifikace typu seznam deklarátorů ; Příklady: int i; int *ai; int ia[10]; int fi(double); proměnná typu int proměnná typu ukazatel na int proměnná typu pole s 10 prvky typu int proměnná typu funkce z double do int 13

Čtení složitějších deklarací Deklarátory je třeba číst zevnitř ven postupně podle následujících pravidel: najdi deklarovaný identifikátor a zjisti, zda se vpravo od něj nachází [ nebo ( interpretuj tyto závorky a pak zjisti, zda se vlevo od identifikátoru nachází * kdykoliv narazíš na ), vrať se zpět a aplikuj předchozí pravidla uvnitř závorek ( a ) nakonec použij specifikaci typu 14

Příklad čtení deklarace char *( *(*x)() )[10]; 1. identifikátor x je deklarován jako 2. ukazatel na 3. funkci vracející 4. ukazatel na 5. pole 10-ti elementů, kterými jsou 6. ukazatelé na 7. hodnoty typu char 15

Definice vlastních typů Syntaxe: Příklady: using Byte = unsigned char; typedef unsigned char Byte; using alias = typ; typedef typ alias using Word = short int; typedef unsigned short int Word; using Matice = int[10][10]; typedef int Matice[10][10]; Možné deklarace: static Word *ptr; const Byte b = 0xBE; const Matice m = {{ /**/ }}; extern Word w; 16

Ukazatelé (pointers) Ukazatel je datový typ, který obsahuje paměťovou adresu. Říkáme, že ukazatel na tuto adresu ukazuje. Navíc rozlišujeme ukazatele podle toho, jaký typ proměnné se na adrese nachází. int* ukazuje na adresu, kde se nachází int. Čti: ukazatel na int. char* ukazuje na adresu, kde se nachází char. Čti: ukazatel na char. bool** ukazuje na adresu, kde se nachází bool*. Čti: ukazatel na ukazatel na bool. 17

Inicializace Datové objekty (proměnné, konstanty) se inicializují v době vzniku statické a globální na začátku programu ostatní v době deklarace (na začátku funkce, bloku), pokud jsou statické, tak jen poprvé Implicitní inicializace statické objekty jsou vynulovány ostatní nemají definovanou hodnotu Explicitní inicializace deklarátor = výraz nebo deklarátor = { seznam výrazů } Statické objekty lze inicializovat pouze konstantními výrazy Příklady: float A = 10.2f; int B = 123; 18

Inicializace v C++ Lze použít stejné tvary jako v C. Navíc deklarace s explicitní inicializací může mít tvar: typ deklarátor ( výraz ) ; typ deklarátor { výraz } ; nebo (C++11) int a = 5; // počáteční hodnota: 5 int b(3); // počáteční hodnota: 3 int c{ 2 }; // počáteční hodnota: 2 int result; // počáteční hodnota není určena V deklaraci s explicitní inicializací můžeme použít automatické odvození typu: int a = 0; auto b = a; // totéž jako: int b = a; 19

Výrazy Bohatý repertoár operací: aritmetické, bitové, logické, relační, operace s ukazateli Výraz může označovat modifikovatelný objekt (lvalue) nebo hodnotu (rvalue) Pořadí vyhodnocení operandů není (až na výjimky) specifikováno normou, ale implementací! Některé operace mají vedlejší efekt (inkrementace, dekrementace, přiřazení) => v jednom výrazu nad jedním objektem max. jeden! i = i++; // Nedefinované chování a = ++i + i++; // Nedefinované chování 20

Výrazy (pokračování) Operace se provádějí v těchto aritmetikách: int, unsigned, long, unsigned long, float, double, long double Před provedením operace může dojít k implicitní konverzi operandů: char, short (signed, unsigned) a enum jsou před provedením operace konvertovány na int (nebo unsigned int) tzv. roztažení (integral promotion) pole prvků typu T je konvertováno na ukazatel na T jméno funkce je konvertováno na typ ukazatel na funkci 21

Výrazy (pokračování) U většiny operací s aritmetickými operandy se provádějí tzv. běžné aritmetické konverze (usual arithmetic conversion): operandy se konvertují pomocí roztažení, a následně se převedou na stejný typ, dle tabulky operand typu zůstane druhý se převede na long double double float unsigned long long unsigned int long double double float unsigned long long unsigned int 22

Typy číselných literálů Typy číselných literálů: 12 int 12U unsigned int 12L long 12ULL unsigned long long 3.4 double 3.4F float 3.4L long double Příklady: 'a' + 'b' konverze na int, výsledek int 1 / 2 celočíselné dělení, výsledek 0 1.0 / 2.0 reálné dělení, výsledek double 1 / 2.0L 1 je konvertována na long double 23

Přiřazení Syntaxe: X = Y Levý operand musí být modifikovatelný (lvalue) Přiřazení má hodnotu a vedlejší efekt Hodnotou výrazu je hodnota X po přiřazení Pozor: plete se = a == Přípustné typy operandů: levá a pravá strana jsou téhož skalárního typu nebo téhož typu struct, class nebo union (pro pole není přiřazení dovoleno) jsou-li typy levé a pravé strany skalární, avšak různé, musí být hodnota pravé strany konvertibilní na typ levé strany Složené přiřazení: += -= *= /= %= &= = ^= <<= >>= Význam: X op= Y je zkratkou za X = X op Y 24

Operace Aritmetické: Unární: Binární: Relační: Binární: Logické: Unární:!a Binární: a&&b a b Bitové: a++ a-- ++a --a a+b a-b a*b a/b a%b a<b a>b a<=b a>=b a==b a!=b Unární: ~a Binární: a&b a b a^b a<<b a>>b Další: Binární: Ternární: a=b a,b a?b:c 25

Konverze při přiřazení Následující tabulka udává možné konverze při přiřazení: typ pravé strany typ levé strany poznámka ke konverzi reálný kratší reálný zaokrouhlení mantisy reálný delší reálný doplnění mantisy nulami reálný celočíselný odseknutí necelé části celočíselný reálný možná ztráta přesnosti celočíselný kratší celočíselný odseknutí vyšších bitů celočíselný unsgn. delší celočíselný doplnění nulových bitů celočíselný sgn. delší celočíselný rozšíření znaménka nullptr T * T * nebo nullptr void * opačné přiřazení musí být explicitní 26

Bitové operace Jen pro celočíselné operandy Unární: ~ negace jednotlivých bitů Binární: & logický součin jednotlivých bitů logický součet jednotlivých bitů ^ logický xor jednotlivých bitů << posun bitové reprezentace levého operandu vlevo >> posun bitové reprezentace levého operandu vpravo U operací posunu pravý operand udává délku posunu v bitech Pozor, plete se & a &&, a : x = 1; y = 2; x & y == 0 (x && y) == 1 27

Operace s ukazateli Pokud ukazatel u ukazuje na adresu, kde se nachází proměnná p, říkáme, že u ukazuje na p. Operátor & (address-of) vytvoří ukazatel z proměnné. int proma = 31; int promb = 13; int* ukaz = &proma; // ukaz ukazuje na proma ukaz = &promb; // ukaz ukazuje na promb Operátor * (dereference) vytvoří proměnnou z ukazatele. int promc = *ukaz; // promc je nyní 13 proma = *ukaz; // proma je nyní 13 *ukaz = 42; // promb je nyní 42 28

Příkazy Obecně: příkazy se dělí na jednoduché a strukturované všechny jednoduché jsou zakončeny středníkem podmínka v cyklech a podmíněném příkazu je dána výrazem skalárního typu; je splněna, je-li hodnota výrazu různá od nuly Výrazový příkaz: výraz ; smysl mají jen výrazy s vedlejším efektem: x = y + 2; y++; f(a, 2); g(); g; // příkaz bez vedlejšího efektu Prázdný příkaz: ; použití např. jako prázdné tělo cyklu: for (i = 0; i < 10; a[i++] = 0); 29

Příkazy (pokračování) Příkaz bloku: { posloupnost příkazů a deklarací } deklarace jsou v bloku lokální, v bloku platí též deklarace z nadřazeného kontextu, lokální deklarace zastíní deklaraci stejného identifikátoru z nadřazeného kontextu, deklarace mohou chybět (složený příkaz). { } int a, b; a = 10; { int c = a; /* c = 10 */ int a = 20; c = a; /* c = 20 */ a = 0; } cout << a; /* vypíše se 10 */ 30

Příkazy (pokračování) Podmíněný příkaz: if ( podmínka ) příkaz if ( podmínka ) příkaz1 else příkaz2 Příkaz while: while ( podmínka ) příkaz Příkaz do: do příkaz while ( podmínka ) ; Příkaz for: for ( výraz1 ; výraz2 ; výraz3 ) příkaz Příkaz for řízený rozsahem (C++11): for ( deklarace : rozsah ) příkaz 31

Příklad // Cyklus for řízený rozsahem (range-based) #include <iostream> #include <string> int main() { std::string str{ "Hello!" }; for (char c : str) { std::cout << "[" << c << "]"; } std::cout << '\n'; } // typ proměnné v deklaraci lze nechat odvodit for (auto c : str) 32

Příkazy (pokračování) Příkaz break: ukončí bezprostředně nadřazený cyklus nebo přepínač Příkaz continue: přejde na nové vyhodnocení podmínky cyklu Příkaz switch (přepínač): switch ( výraz ) příkaz návěští v přepínači: case konst. výraz: nebo default: 33

Příklad: použití přepínače int zn = 2; switch (zn) { case 1: printf("výborně"); case 2: printf("velmi "); case 3: printf("dobře"); default: printf("nedostatečně"); } int zn = 2; switch (zn) { case 1: printf("výborně"); break; case 2: printf("velmi "); case 3: printf("dobře"); break; default: printf("nedostatečně"); } Chybně Správně 34

Konec