Č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)
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
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é)
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
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"
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
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ý bitvelikost čí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
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ápis
double (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
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
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
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)
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á pismenaTyp 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
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’
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
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é
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';
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ší…
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
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--
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
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 ) pokra č:• 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
A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 43
Standardní knihovny (3)
Standardní knihovny (ANSI C library – Standard Library ) pokra č:• 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 ) pokra č:• 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
České vysoké učení technické Fakulta elektrotechnická
Algoritmizace a programování
Jazyk C – Jazyk C – výrazy
KONEC