PB071: Úvod do jazyka C - 2

Data, operátory, výrazy, příkazy, řídicí struktury, základní V/V

Datové typy v jazyku C

Základní typy:

Kategorie Základní typ
(kurzíva: jen v C99) 
Modifikátory Příklady konstant
Booleovský
(Jen v C99)
_Bool   0 (znamená false) 1 (znamená true)
Celočíselné

int

short/long
(v C99 i long long)
unsigned/signed
-5 180L 40000u 3222111000Lu 037 (=31) 0x1fff (=8191)
(v C99: -9876543210LL)
char unsigned/signed 'A' '\n' (= 10, nový řádek)
'\r' (=13, na začátek řádku)
'\t'
(=9, tabulátor)
'\010'
, '\b' (=8, backspace)
'\a'
(=7, pípnutí)
'\xff'
(v C jsou tyto konstanty vlastně formálně typu int)
wchar_t
(Jen v C99)
unsigned/signed L'A' L'\u73c5' L'\U2468abcd'
(v C jsou tyto konstanty vlastně formálně typu int)
Reálné float   1.0f

double

long -1.25 1e-6  -3.5e2950L
(v C99: 0x1f.8p19, tj. 31.5*219)
Komplexní
(Jen v C99)

_Complex
_Imaginary

float/double/long double
(1 z těchto modifikátorů musí být uveden)
 
Prázdný void    

char lze automaticky konvertovat na int a naopak.

V K-R C a ANSI C neexistuje logický typ; místo něj se používá kterýkoli celočíselný typ (0 má význam false, 1 nebo jiné nenulové číslo true).

Další modifikátory a kvalifikátory:

const, volatile
auto, static, extern, register

Uživatelské typy:

Podrobněji v jiné přednášce.

Příklady deklarací

float xA,yA,p,q,r=5.0,epsilon=1e-6; double dd;
int i,j; short int si; unsigned long int uli;
char ch='A', bell=7;
const double pi=3.14159265359;

Operátory a výrazy

Nejvyšší priorita - zleva doprava:
() Volání funkce, např. sqrt(2*alfa) (něco jiného jsou uzávorkované výrazy)
[] Prvek pole
. Výběr prvku struktury
-> Výběr prvku struktury zadané ukazatelem
Nižší priorita - ZPRAVA DOLEVA:
! Logická negace
~ Jednotkový doplněk (z nulových bitů udělá jednotkové a naopak)
+ Potvrzení znaménka (unární plus)
- Změna znaménka (unární minus)
++ Inkrementace (přičtení 1). Prefixový a postfixový tvar! Jak i++ tak ++i přičte k i jedničku, ale jako výsledek nevrací totéž!
-- Dekrementace (odečtení 1). Prefixový a postfixový tvar!
& Vytvoření ukazatele: &x vytvoří ukazatel (adresu) na x
* Dereference ukazatele: je-li p ukazatel, *p je hodnota, na niž ukazuje
(typ) Přetypování (konverze typu): (double)pocet převede hodnotu proměnné pocet na hodnotu typu double
sizeof Velikost objektu (násobek délky typu char,v C99 přímo počet bajtů). Operandem je (typ) nebo výraz: sizeof(long double), sizeof pocet
Nižší priorita - zleva doprava:
* Násobení (binární *)
/ Dělení
% Modulo (zbytek po celočíselném dělení)
Nižší priorita - zleva doprava:
+ Sčítání
- Odčítání
Nižší priorita - zleva doprava:
<< Bitový posun vlevo: x<<3 posune o 3 bity doleva, čili násobí 8
>> Bitový posun vpravo: x>>n posune o n bitů doprava, čili dělí 2n
Nižší priorita - zleva doprava:
< Menší než - výsledkem je 1 (true) nebo 0 (false)
<= Menší nebo rovno (dtto)
> Větší než (dtto)
>= Větší nebo rovno (dtto)
Nižší priorita - zleva doprava:
== Test na rovnost (dtto)
!= Test na nerovnost (dtto)
Nižší priorita - zleva doprava:
& Logický součin bit po bitu (and) - provádí se nad stejnolehlými bity obou operandů
Nižší priorita - zleva doprava:
^ Logické vylučovací nebo bit po bitu (xor) (dtto)
Nižší priorita - zleva doprava:
| Logický součet bit po bitu (or) (dtto)
Nižší priorita - zleva doprava:
&& Logický součin (and) - celý operand se považuje za true, je-li nenulový nebo za false je-li roven nule; výsledkem je 1 (true) nebo 0 (false)
Nižší priorita - zleva doprava:
|| Logický součet (or) (dtto)
Nižší priorita - ZPRAVA DOLEVA:
?: Podmíněný výraz: podmínka?výraz1:výraz2 znamená, že je-li podmínka splněna, výsledkem je výraz1, v opačném případě výraz2
Nižší priorita - ZPRAVA DOLEVA:
= += -= *= /= %= <<= >>= &= ^= |= Přiřazení, resp. kombinace jiná operace spolu s přiřazením. Např. x*=y znamená x=x*y
Nejnižší priorita - zleva doprava:
, Postupné provedení (Umožňuje zapsat více výrazů tam, kde syntakticky smí být jen jeden; výsledkem je hodnota posledního výrazu. Hodnota předchozích výrazů se zapomene, mohou mít ovšem vedlejší účinky.)

POZOR: Rozlišujte & a &&, | a ||

Výrazy

výraz = posloupnost operátorů a operandů s případnými uzávorkovanými podvýrazy.

Příklady

Konstantní výrazy

Výrazy s operátory aplikovanými pouze na konstanty. Nesmí obsahovat operátory, které mění hodnotu nějaké veličiny (++, přiřazení apod.) Obvykle se vyhodnocují už při překladu.

Použití: Všude, kde lze zapsat konstantu, lze zapsat i konstantní výraz.

Příkazy

Doplněním středníku se výraz;  stává příkazem:

i=j=k=30; Význam: i=(j=(k=30));

Shodný význam: i=i+1; i+=1; i++; ++i;

Shodný význam: j=5*(i=i+1)+2; j=5*(++i)+2;

Ale pozor - jiné je: j=5*(i++)+2;

Pozor! Středník je součástí příkazu, ne oddělovač po sobě jdoucích příkazů, musí proto být i za posledním příkazem ve skupině.

Přetypování:

int i; double d=37.9; i=(int)d%2;

Pozor! Přetypování může mít podle kombinace typů různé významy. Někdy se (přibližně) zachová hodnota, jindy vnitřní zobrazení a výsledek může být nesmyslný.

Řídicí struktury

Složený příkaz

Pokud chceme na místě, kde syntax jazyka vyžaduje jeden příkaz, zapsat příkazů více, uděláme z nich složený příkaz pomocí složených závorek {} (viz dále)

Podmíněný příkaz

Příkazy if a else

if (a<b) m=n=100;
if (x>=0.5) {i=10; j=20;} else {k=30; l=40;}
if (u>=0 && u<3.0) {v=1.8; w=3.4;}

Je-li v sobě vnořeno několik if, patří else k poslednímu if bez else

Ve struktuře if se na rozdíl od jiných jazyků nepoužívá klíčové slovo then

Cykly

Součet čísel od 1 do n:

Cyklus while

s=0; i=1;
while (i<=n) {s+=i; i++;}

Cyklus do

s=0; i=1;
do {s+=i; i++;} while (i<=n);

Cyklus for

s=0;
for (i=1;i<=n;i++) s+=i;

Možno sloučit do 1 příkazu:

for (i=1,s=0;i<=n;i++) s+=i;

Totožné, avšak méně srozumitelné je i:

for (i=1,s=0;i<=n;s+=i,i++);

nebo třeba:

for (i=1,s=0;i<=n;)s+=i++;

Přepínač

switch (n)

{ case 1: a+=b; break;
  case 2:
  case 3: a*=b; break;
  default: printf("Chybné n\n"); exit(0);
}

Pozor! Není-li větev case ukončena příkazem break, následuje po ní další příkaz, i kdyby před ním byl jiný case.

Příkazy break a continue

Vztahují se vždy k "nejvnitřnější" konstrukci while, do, for nebo switch. Příkaz continue má význam jen v cyklu; znamená průchod na další iteraci cyklu. Pozor na to, že tyto příkazy neznamenají konec konstrukce if!

Nejdůležitější příkazy pro vstup a výstup

Vstup

Proměnná typu int se přečte příkazem scanf("%d",&proměnná); pro proměnné jiných typů použijeme místo %d jinou kombinaci:

Typ: int short int long int long long int float double long double char char[]
(textový řetězec)
Formátování: %d %hd %ld %lld %f %lf %Lf %c %s

Pozor: 

Časté problémy:

Výstup

Textový řetězec (zapsaný do uvozovek) vypíšeme příkazem printf("Pozadovany text");

Kombinace textu a hodnot proměnných nebo výrazů se vypíše tak, že do vypisovaného textu vložíme opět formátovací kombinace podle tabulky a pro každou takovou kombinaci přidáme další parametr. Avšak pozor -na rozdíl od scanf v printf odpovídá jak hodnotám typu float, tak typu double formátová kombinace %f (platí  v ANSI C, v C99 se pro výstup hodnoty double používá %lf). Např.:
printf("text%dtext%ftext%lftext\n", celočíselný_výraz, float_výraz, double_výraz);

Za znak % je možno doplnit 1 až 2 čísla, např.:
%8d ... tisk na 8 míst
%16.10lf ... tisk celkem na 16 míst, z toho 10 za desetinnou tečkou. První číslo se nedodrží, pokud s daným počtem nelze hodnotu vypsat.

Funkce printf rovněž vrací celočíselnou hodnotu, avšak na rozdíl od scanf je to počet vypsaných znaků.


Předchozí Předchozí přednáška Další Další přednáška Hlavní stránka Hlavní stránka