1
České vysoké učení technické Fakulta elektrotechnická
Algoritmizace a programování
Ver.1.10
Jazyk C – výrazy
J. Zděnek 2015
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 2
Struktura programu (1)
Program v C se skládá z následujících sou částí:
• Příkazy preprocesoru (Preprocessor commands)
• Definice typů (type definitions)
• Prototypy funkcí (function prototypes) kde je uvedena deklarace:• Jména funkce• Vstupních parametrů
• Návratové hodnoty funkce
• Proměnné (variables)
• Funkce (functions) (v C je procedura funkce bez návratové hodnoty)
2
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 3
Struktura programu (2)
Funkce v C mají tento tvar:
• Každý program musí obsahovat právě jednu funkci main()
• Všechny funkce (včetně main()) mají jednotný formát:
typ_navrat_hodnoty jmeno_fce (parametry_fce){lokalni promenneprikazy
}
• Uvnitř funkce nelze definovat lokální funkce (definice funkci nesmí být vnořené)
• Na formátování zdrojového textu překladači nezáleží. Formátování zlepšujeautorovi (i ostatním) čitelnost a potlačuje chyby.
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 4
Model kompilace (1)
Preprocessor
Compiler
Assembler
Linker
Source code
Header
Source code
Libraries
Executable code
Source codeAssembly code
Object codesoubor5.lib
soubor1.c
soubor2.h
soubor3.c
1)
2)
3)
4)
Zdroj.kód C
Spustitelný kód
Zdroj.kód ASM
Knihovny
soubor4.asm
3
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 5
Model kompilace (2)
Vytvo ření spustitelného kódu (viz obr):• 1) Preprocesor:
• Čte zdrojový kód v C
• Odstraní komentáře• Upraví zdrojový text podle direktiv preprocesoru (řádky začínající #)
• Vloží do textu obsah jiného souboru #include ….
• Odebere text vymezený direktivami podmíněného překladu• Expanduje makra
• 2) Překladač C: • Čte výstup z preprocesoru • Kontroluje syntaktickou správnost textu
• Hlásí chyby a varování• Generuje text v assembleru (když nejsou chyby)
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 6
Model kompilace (3)
Vytvo ření spustitelného kódu (viz obr):• 3) Assembler:
• Čte výstup z překladače C
• Generuje relokovatelný object kód (kód s nevyřešenými odkazy mezi moduly)
• Přeloží případné moduly zapsané přímo v assembleru (mix programovacích jazyků)
• 4) Linker (spojovací program):• Čte object kód všech zůčastněných modulů programu• Připojí knihovní object moduly (přeložené dříve nebo dodané),
• Vyřeší odkazy mezi moduly• Generuje spustitelný kód (zjednodušené)
4
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 7
Soubor platných znaků (ASCII) (1)
C - základní soubor znak ů:
• A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
• a b c d e f g h i j k l m h o p q r s t u v x y z
• 0 1 2 3 4 5 6 7 8 9
• ! “ # % & ‘ ( ) * + , - . / : ; < = > ? [ \ ] ^ ? _ { | } ~
• Oddělovače (whitespace characters)space, horizontal tab, vertical tab, newline, form feed
• \0 - null char (koncový znak řetězce)
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 8
Soubor platných znaků (ASCII) (2)
C - základní soubor znak ů (pokra č.):• Řídicí znaky pro řízení výstupních zařízení (escape sequences)
C - ostatní znaky:• Mohou se použít v komentářích, řetězcích a znakových konstantách
h…=šestnáctkovéčíslice (hex dig.)
\xh…( př: \x1008 )
Horizontal tab\t
Vertical tab\v
o=osmičkovéčíslice (octal dig)
\o \oo \ooo( př: \741 )
Carriage return\r
Znak \\\Newline \n
Znak ?\?Form feed\f
Znak “\”Backspace\b
Znak ‘\’Beep (pípnutí)\a
VýstupEscape sequenceVýstupEscape sequence
5
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 9
Identifikátory
C - pravidla pro volbu identifikátor ů:• Obsahuje A,..,Y,a,..,z,0,..,9 a znak _ (underscore) • První znak není číslice
• Rozlišují se velká a malá písmena (case sensitive)• Délka identifikátoru není omezena, ale pouze 31 prvních znaků je
významných (může se lišit podle implementace)
C - rezervovaná slova (keywords):• Musí být zapsaná malými písmeny
void
unsigned
union
typedef
switch
struct
staticlongexterncontinue
sizeofintenumconst
signedifelsechar
shortgotodoublecase
whilereturnfordobreak
volatileregisterfloatdefaultauto
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 10
Datové typy
• Při návrhu algoritmů a psaní programů ve vyšších programovacích jazycích abstrahujeme od binární podoby paměti počítače
• S daty pracujeme jako s hodnotami různých datových typů, které jsou uloženy v datových objektech
• Datový typ (zkráceně jen typ) specifikuje:
• množinu hodnot (+ reprezentace)• množinu operací, které lze s hodnotami daného typu provádět
• Příklad typu: celočíselný typ int v jazyku C:
• množinou hodnot jsou celá čísla (interval je závislý na implementaci)• množinu operací tvoří
• aritmetické operace +, -, *, /, jejichž výsledkem je hodnota typu int
• relační operace ==, !=, >, >=, <, <=, jejichž výsledkem je logickáhodnota. V jazyce C není zavedena logický typ proměnné. Logický stav se vyhodnocuje dle hodnoty číselné proměnné kde:= 0 znamená "false", ≠ 0 znamená "true"
6
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 11
Reprezentace dat v počítači
• bit (binary digit – dvojková číslice; angl. bit – drobek, kousek)• základní a nejmenší jednotky informace • nabývá hodnot 0 nebo 1
• byte (též bajt, česky - slabika) – uspořádaná osmice bitů
• Násobky
• 1 kB = 1 000 bajtů (dekadický kilobajt, malé „k“)• 1 KB = 1 024 bajtů = 210 (binární kilobajt, velké „K“)
• 1 MB = 1 048 576 bajtů = 220
• 1 GB = 1 073 741 824 bajtů = 230
0 1 1 0 0 1 1 1
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 12
Reprezentace celých čísel
• Číselné soustavy - polyadické
• Desítková soustava138,24 = 1*102+3*101+8*100+2*10-1+4*10-2
=1*100+3*10+8*1+2*0,1+4*0,01
• Dvojková soustava11010,01b = 1*24+1*23+0*22+1*21+0*20+0*2-1+1*2-2 =
1*16+1*8+0*4+1*2+0*1+0*1/2+1*1/4= 26,25
• Šestnáctková soustava (hexadecimal numeral system)• a = „0“, „1“, „2“,… „9“, „A“, „B“,… „F“; z = 16• Př: 07Dh = 0*162 + 7*161 + D*160 = 0 + 112 + 13 = 125
7
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 13
Reprezentace čísel v počítači
• Celá kladná čísla – přímý binární kód• Př: 125d = 0*27+1*26+1*25+1*24+1*23+1*22+0*21+1*20 = 01111101b
= 0 + 64 + 32 + 16 + 8 + 4 + 0 + 1
• Celá záporná čísla – dvojkový doplněk (two’s complement)• Př: -125d = 10000011b
Výpočet:Kladné číslo: x = +125d = 0111 1101b
-------------------------------
NOT x = 1000 0010b (jednotkový doplněk)+1
--------------------------------
Záporné číslo: -x = -125d = 1000 0011b (dvojkový doplněk)znaménkový bit
velikost čísla (není to přímý binární kód!)
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 14
Nepřesnost v zobrazení reálných čísel
• Pokusme se v dekadické soustavě zapsat číslo 1/3 (jedna třetina)• 0,3• přesněji 0,33• lépe 0,333• ...• 0,333333333333333333333333333333333333
• Jelikož máme omezený paměťový prostor, nikdy neuložíme číslo 1/3 přesně (Jak by číslo 1/3 vypadalo v trojkové soustavě?)
0*31 + 0*30 + 1*3-1 = (0,1)3
8
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 15
Nepřesnost v zobrazení reálných čísel
Reálná čísla X se zobrazují ve tvaru:
X= mantisa * základ exponent
Nepřesnosti způsobují
1. Iracionální čísla ( e , π, ,…. )
2. Čísla, jež mají v dané soustavě periodický rozvoj (1/3 ve dvojkovéči dekadické soustavě, 1/10 ve dvojkové)
3. Čísla, která mají příliš dlouhý zápisdouble (celkem 64 bit ů)
• 1 bit znaménko – dvě možnosti, +,-• 11 bitů exponent – 2048 možností• 52 bitů – 4 503 599 627 370 496 možností, tedy asi 4,5 biliardy
- není možné v typu double přesně uložit čísla se zápisem delším než 52 bitů!
2
exponent mantisa
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 16
Model reprezentace reálných čísel
Reálná čísla se zobrazují jako aproximace daná rozsahem paměťového místa vyhrazeného pro číslo.
Reálná čísla se zobrazují ve tvaru:X = mantisa*základ exponent = m*z exponent
Mantisa musí být normalizována:0,1 <= m < 1, důvod: jednoznačnost zobrazení
Model:• délka mantisy 3 pozice + znaménko• délka exponentu 2 pozice + znaménko
Příklad:X = 77.5 = +0.775*z+02
• lze zakódovat znaménko “+” = 0,” –” = 1• z je 10 (16, 2,..)
+|775+|02
0|775 0|02
9
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 17
Model reprezentace reálných čísel
• Maximální zobrazitelné kladné číslo
• Minimální zobrazitelné kladné číslo
• Maximální zobrazitelné záporné číslo (v absolutní hodnotě)
• Minimální zobrazitelné záporné číslo (v absolutní hodnotě)
• Nula• Jak je to se zobrazitelnými hodnotami „okolo nuly“,
• Jak je to se „sousedy“ aproximací?
-|999 +|99
+|000?|??
0.000z??
0.100z-99
0.101z-99
-0.100z-99
-0.101z-99
0.999z 99-0.999z 99
+|999+|99
+|100 -|99
-|100 -|99
0
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 18
Model reprezentace reálných čísel
• Jaká je vzdálenost dvou aproximací??
• To závisí na hodnotě!!!
• Aproximace reálných čísel:• nejsou na číselné ose rozložené rovnoměrně!!
0.000z??
0.100z-99 0.101z-99 0.100z12
0.101z12
0.999z 99
NULA
+MAXIMUM
NULA +MAXIMUM
10
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 19
Reálná čísla v C (typ double)
• Reálná čísla se zobrazují ve tvaru:X= mantisa*základ exponent = m*z exponent
• V C jsou reálná čísla reprezentována typem double na 64 bitů,
norma IEEE 754
znaménkový bit (s), exponent, mantisa
• nejmenší čísla v normalizovaném tvaru (v abs. hodnotě) ±2−1022 ≈ ±2.2250738585072020 × 10−308
• největší čísla
±(1-(1/2)53)21024 ≈ ±1.7976931348623157 × 10308
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 20
Datové typy (1)
Celočíselné datové typy:
• Velikost celočíselných typů určená implementací• Vždy ale platí (v byte): char <= short <= int <= long• Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true
Celá čísla-32.768 až +32.7672short
Kladná celá čísla0 až 4.294.967.2954unsigned long
Velká celá čísla-2.147.483.648 až +2.147.483.6474long
Kladná celá čísla0 až 65.5352unsigned short
Kladná celá čísla0 až 65.535 nebo0 až 4.294.967.295
2 nebo 4unsigned int
Celá čísla-32.768 až +32.767 nebo-2.147.483.648 až +2.147.483.647
2 nebo 4int
Malá čísla-128 až +1271signed char
Malá čísla0 až 2551unsigned char
Znaky-128 až +127 nebo 0 až 2551char
PoužitíRozsahVelikost [byte]Typ
11
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 21
Datové typy (2)
C - reálná čísla (necelo číselné datové typy):• Velikost reálných čísel určená implementací• Většina překladačů se řídí standardem IEEE-754-1985, potom
jsou rozsahy reálných čísel dány následující tabulkou:
C - typ void:• void značí prázdnou hodnotu nebo proměnnou bez typu (jen ukazatelé)
• void funkce1 (….) - fukce bez návratové hodnoty (procedura)• int funkce2 (void) - funkce bez vstupních parametrů• void *ptr; - ukazatel bez určeného typu (viz dále)
19 desítkových číslic3.4E-4932 až 1.1E+493210long double
15 desítkových číslic2.3E-308 až 1.7E+3088double
6 desítkových číslic1.2E-38 až 3.4E+384float
PřesnostRozsah (uveden pro kladná č.)Velikost [byte]Typ
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 22
Konstanty (1)
6 typů konstant:
• Celočíselné (integer constants)
• Reálné (floating constants)
• Znakové (character constants)
• Řetězcové (literal constants) (literály)
• Výčtové (enumeration constants) (pojmenované prvky množiny)
• Symbolické (#define MAX 300)
12
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 23
Konstanty - celočíselné (2)
Formát celo číselné konstanty:• Desítkový - nezačíná číslicí 0 (nula), př: 1024
• Osmičkový - začíná číslicí 0 (nula), př: 012• Šestnáctkový - začíná znaky 0x nebo 0X (nula x), př: 0x7F8A
• číslice a,..,f (A,..,F) mohou být velká i malá pismena
Typ celo číselné konstanty:• Není-li určen explicitně, přiřadí se nejbližší dostatečně veliký typ
• Desítkové konst. - int, long, unsigned long
• Šestnáctkové a osmičkové - int, unsigned int, long, unsigned long• Určí se explicitně znaky U nebo u (unsigned), L nebo l (long) jinak int
unsigned long0x1BUL0333ul27UL
long0x10L020L16L
unsigned int0xAU012U10U
int0x7FFF07777732767
int0xF01715
TypŠestnáctkov ěOsmi čkověDesítkov ě
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 24
Konstanty - reálné (3)
Formát reálné konstanty:• S řádovou tečkou př: 41.9• Mantisa a exponent př: 5.67E-3 // 5.67*10-3
nebo rovněž 5.67e-3
Typ reálné konstanty:• Není-li určen explicitně, pak je - double• Určí se explicitně znaky
• F nebo f - float
• L nebo l - long double
• V tabulce jsou všechny konstanty typu double
.4E-50.4e-54E-60.000004
0.37e63.7E+537e+4370000.0
12e0.12E212.012.
519E-20.0519e+20.519E15.19
13
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 25
Konstanty - znakové (4)
Formát znakové konstanty :• Jeden nebo více znaků v jednoduchých apostrofech
• př: ‘B’, ‘g’, ‘ab’, ’9’
Hodnota znakové konstanty :• Jednoznaková konstanta má hodnotu odpovídajícího kódu znaku
• př: v ASCII kódu ‘0’ ~= 48, ‘A’ ~=65• Víceznaková konstanta - hodnota závisí na implementaci překladače C
Typ znakové konstanty:• Znaková konstanta je typu int
Pozn:• Řídicí znaky (escape sequences) mohou tvořit znakové konstanty
• př: ‘\n’
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 26
Konstanty - řetězcové (literály) (5)
Formát řetězcové konstanty (literálu) :• Posloupnost znaků a řídicích znaků (escape sequences)
uzavřená v uvozovkách• př: “Já jsem řetězcová konstanta ! \n”
Pozn:• Řetězcové konstanty oddělené pouze oddělovači (whitespace characters)
jsou sloučeny do konstanty jediné.• př: “Já jsem” “řetězcová konstanta ! \n”
se sloučí do “Já jsem řetězcová konstanta ! \n”
Typ řetězcové konstanty:• Řetězcová konstanta je uložená v poli typu char (array of char) a je
zakončená znakem ‘\0’• př: “Nazdar” se uloží v poli typu char takto:
‘\0’‘r’‘a’‘d’‘z’‘a’‘N’
14
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 27
Konstanty - výčtové (enum type) (6)
Formát vý čtové konstanty :• enum { CERVENA, MODRA, BILA, CERNA};
• pak CERVENA=0 a každý další prvek má hodnotu o jedničku vyšší
• enum { MALY=5, VETSI, VELKY, NEJVETSI }• pak MALY=5, VETSI=6 a každý další prvek má hodnotu o jedničku vyšší
Typ vý čtové konstanty:• Výčtová konstanta je typu int
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 28
Konstanty - symbolické #define (7)
Formát symbolické konstanty #define:• Konstanta se založí příkazem preprocessoru #define
(je to makro bez parametrů, každé #define musí být na samostatné řádku)
př:#define CERVENA 0 /* Zde muze byt komentar */#define MODRA 1 / /Je zvykem jména konstant psát velkými písmeny
#define BILA 2
• Hodnotu konstanty je možné vyjádřit konstantním výrazem
př:#define MAX_1 (100*5)-12
• Symbolické konstanty mohou být vnořenépř:#define MAX_2 MAX_1+30
15
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 29
Komentář
C používá dva zp ůsoby ozna čení komentá ře:• /* Toto je komentář */
• /* Toto je rovněž komentářrozdělený na několik řádků
*/
• // Toto je též komentář až do konce řádku
• /* Komentář nesmí být vnořený do jiného komentáře• /* to je chybný zápis komentáře */• */
• Preprocesor nahradí každý komentář jednou mezerou• // ….. tento způsob některé překladače nepodporují
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 30
Proměnné a přiřazení
• Proměnná je datový objekt, který je označen jménem a je v něm uložena hodnota nějakého typu, která se může měnit
• V jazyku C zavedeme výše uvedenou proměnnou deklaracíint alfa = 0;
• Hodnotu proměnné lze změnit přiřazovacím příkazem
alfa = 37;
0alfa
37alfa
0alfa
jméno proměnné datový objekt
hodnota proměnné
16
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 31
Deklarace proměnných
• Proměnné se zavádějí deklaracemi• Příklady deklarací proměnných:
int i; // deklarace prom ěnné i typu int
double x; // deklarace prom ěnné x typu double
• Proměnná deklarovaná uvnitř funkce (lokální proměnná) nemá deklaracídefinovanou hodnotu
• Deklaraci proměnné lze doplnit o inicializaci proměnné:int x = 10; // deklarovaná prom ěnná má hodnotu 10
• Deklarací lze zavést několik proměnných stejného typu:int x, z;
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 32A0B36PRI „PROGRAMOVÁNÍ“ 02 32
Přiřazovací příkaz
• Slouží pro přiřazení hodnoty proměnné• Tvar přiřazovacího příkazu:
<proměnná> = <výraz>;
• Příklad:x = y + z;
proměnné x se přiřadí součet hodnot proměnných y a zx = x + 1;
hodnota proměnné x se zvětší o 1
• Příklady přiřazovacích příkazů:int i; double d; char c
i = 14;
d = 3.14;
c = 'A';
17
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 33A0B36PRI „PROGRAMOVÁNÍ“ 02 33
Přiřazovací příkaz
• Přířazovací operátory:
<proměnná> = <proměnná> <OP> <výraz> ~ <proměnná> <OP>= <výraz>
Př.:j += 5; ~ j = j + 5;
• přiřazení je výraz !!!:Př.:int x, y;
x = 7; // má hodnotu 7 a lze tedy op ět p ři řadit!!
y = x = x + 6;// vyhodnotí se jako y = (x = (x + 6));
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 34A0B36PRI „PROGRAMOVÁNÍ“ 02 34
Příkaz výstupu - printf()
• printf("Cislo Pi = %6.3f \n ", Math.PI);
Výstup na obrazovku: Cislo Pi = 3.142
• Specifikace formátu %[$indexParametru][modifikátor][ší řka][.p řesnost]konverze
• konverze - povinný parametr• typ celé číslo d,o,x - dekadicky, oktalově a hexadecimálně• typ double f je desetinný zápis; e,E vědecký s exponentem
• šířka - počet sázených míst, zarovnání vpravo• přesnost - počet desetinných míst• modifikátor - v závislosti na typu konverze určuje další vlastnosti, například
pro konverzi f (typ double)• symbol + určuje, že má být vždy sázeno znaménko,• symbol - určuje zarovnání vlevo, • symbol 0 doplnění čísla zleva nulami.
• \n přechod na další řádek• a další…
18
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 35
Příkaz vstupu – scanf()
• V dalších příkladech budeme potřebovat příkazy pro vstup číselných dat zadaných na klávesnici
• Použijeme standardní funkce scanf()
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int pocet;
scanf("%d", &pocet);
printf("Pocet = %d", pocet);
}
• Ve funkci scanf() je nutné uvést očekávaný formát vstup (zde %d znamenáceločíselný formát a proměnnou do které se má hodnota z klávesnice uložit. Pozor před hodnotou musí být znak & (znamená to volání odkazem viz dalšípřednášky)
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 36
Typové konverze
• Typová konverze je operace, která hodnotu nějakého typu převede na hodnotu jiného typu, důvod jiná reprezentace čísel
• Typová konverze může být implicitní (vyvolá se automaticky) nebo explicitní(v programu je třeba ji explicitně předepsat)
• Konverze typu int na double je v jazyku C implicitní:• kde se očekává hodnota typu double , může být uvedena hodnota typu
int, která se automaticky převede na hodnotu typu double
• Příklad:double x; int i = 1;x = i; //hodnota 1 typu int se automaticky p řevede
//na hodnotu 1.0 typu double
• Převod hodnoty typu double na int (odseknutím necelé části) je třeba explicitně předepsat
• Příklad:double x = 1.2; int i;i = (int)x; //hodnota 1.2 typu double se odseknutím
//necelé části p řevede na hodnotu 1 typu int
19
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 37
Výrazy• Výraz předepisuje výpočet hodnoty určitého typu• Příklad výrazu: {14.6 + sin(3.14)} * a100
• Výraz může obsahovat:• proměnné• konstanty
• volání funkcí• binární operátory• unární operátory
• závorky• Pořadí operací předepsaných výrazem je dáno:
• prioritou operátorů
• asociativitou operátorů• Příklad:
výraz pořadí operací zdůvodněníx + y * z x + (y * z) * má vyšší prioritu nežx + y + z x + y) + z + je asociativní zleva
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 38
Aritmetické operátory
• Pro operandy typu int a double budeme požívat tyto aritmetické operátory (seřazeno sestupně podle priority):• unární – (změna znaménka)• binární *, /, % (násobení, dělení a zbytek po dělení)
• binární + a – (sčítání a odčítání)
• Jsou-li oba operandy stejného typu, výsledek aritmetické operace je téhožtypu
• Jsou-li operandy různého typu, operand typu int se implicitní konverzípřevede na hodnotu typu double a výsledkem operace je hodnota typu double
• Výsledkem dělení operandů typu int je celá část podílunapř. 7/3 je 2 -7/3 je -2
• Pro zbytek po dělení platí: x % y = x – ( x / y ) * y
např: 7%3 je 1; -7%3 je -1; 7%-3 je 1; -7%-3 je -1
• speciální inkrementační a dekrementační operátory:++x, x++, --x, x--
20
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 39
Relační operátory• Hodnoty všech jednoduchých typů jsou uspořádané a lze je porovnávat
relačními operátory• Budeme používat tyto relační operátory (priorita je menší než priorita
aritmetických operátorů):• >, <, >=, <= (větší než, menší než, větší nebo rovno, menší nebo
rovno)
• ==, != (rovná se, nerovná se)
• Výsledek relační operace je (true , když relace označená operátorem platí, false v opačném případě)(true se v "C" hodnotí dle výsledku ≠ 0 a false dle výsledku = 0. V "C" není typ logické proměnné.
• Jestliže při porovnávání číselných hodnot jsou operandy různého typu, operand typu int se implicitní konverzí převede na hodnotu typu double
• Relační operátory mají menší prioritu, než aritmetické operátory
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 40
Logické operátory
• Logické operátory jsou unární a binární• unární ! (negace)• binární && resp. & (konjunkce, logický součin)• binární || resp. | (disjunkce, nevýhradní logický součet, OR)• binární ^ (disjunkce, výhradní logický součet, XOR)
x y !x x && y x || y x ^ yfalse false true false false falsefalse true true false true truetrue false false false true truetrue true false true true false
• Negace má stejnou prioritu, jako změna znaménka, logický součin má nižší prioritu nežrelační operátory
• Operace && a || se vyhodnocují zkráceným způsobem, tj. druhý operand se nevyhodnocuje, jestliže lze výsledek určit již z prvního operandu
21
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 41
Standardní knihovny (1)
Standardní knihovny (ANSI C library – Standard Library) :• Vlastní jazyk C neobsahuje žádné prost ředky pro vstup a výstup dat, složit ější
matematické operace, práci s řetězci, t řídění, blokové p řesuny dat v pam ěti, práci s datem a časem, komunikaci s opera čním systémem,správu pam ěti pro dynamické p řidělování, vyhodnocení b ěhových chyb (run-time errors) apod.
• Tyto a další funkce jsou však obsaženy ve standardních knihovnách (ANSI C Library) dodávaných s p řekladači jazyka C.
• Uživatel dostává k dispozici p řeložený kód knihoven (který se p řipojuje – linkuje k uživatelovu kódu) a hlavi čkové soubory (headers) s prototypy funkcí, novými typy, makry a konstantami
• Hlavi čkové soubory (obdoba interface v Jav ě) se připojují k uživatelovu kódu direktivou preprocesoru #include <…>.
• Je zvykem , že hlavi čkové soubory mají rozší ření *.h , např. stdio.h
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 42
Standardní knihovny (2)
Standardní knihovny (ANSI C library – Standard Library) p okra č:• Standardní knihovny jsou rozd ěleny do následujících částí:
(uvedeno pro ANSI C95):
• Vstup a výstup (formátovaný i neformátovaný)• stdin.h
• Rozsahy čísel jednotlivých typ ů
• limits.h
• Matematické funkce• stdlib.h• math.h
• Zpracování b ěhových chyb (run-time errors)• errno.h• assert.h
22
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 43
Standardní knihovny (3)
Standardní knihovny (ANSI C library – Standard Library) p okra č:• Standardní knihovny jsou rozd ěleny do následujících částí:
(uvedeno pro ANSI C95) pokra č:
• Klasifikace znak ů (typ char)• ctype.h
• Práce s řetězci (string handling)• string.h
• Internacionalizace (adaptace pro r ůzné jazykové mutace)• locale.h
• Vyhledávání a t řídění• stdlib.h
• Blokové p řenosy dat v pam ěti• string.h
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 44
Standardní knihovny (4)
Standardní knihovny (ANSI C library – Standard Library) p okra č:• Standardní knihovny jsou rozd ěleny do následujících částí:
(uvedeno pro ANSI C95) pokra č:
• Správa pam ěti (Dynamic Memory Management)• stdlib.h
• Datum a čas• time.h
• Komunikace s opera čním systémem• stdlib.h• signal.h
• Nelokální skok (lokální je sou částí jazyka, viz goto)• setjump.h
23
České vysoké učení technické Fakulta elektrotechnická
Algoritmizace a programování
Jazyk C – Jazyk C – výrazy
KONEC