Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Učíme se C (1. díl)
15. srpna 2000, 00.00 | Štve vás, že všichni programují v C a vy ne? Pak možná právě pro vás je
tu seriál o programování v C, jehož první díl si právě můžete přečíst.
Číselné datové typy
Úplně na začátek se podíváme na zoubek datovým typům proměnných. Základní typy v C jsou prakticky stejné jako v jiných jazycích. Pro začátek se budeme věnovat proměnným jednoduchých číselných datových typů, mezi které patří celá a reálná čísla (záměrně ještě zapomínám na vyjmenovaný datový typ enum, na který přijde řada jindy).
celočíselné typy
Hlavním celočíselným typem v C je typ int. Je dobré preferovat právě tento datový typ, protože je přizpůsoben k tomu, aby operace s ním probíhaly co nejrychleji. V různých implementacích překladačů C může proměnná typu int obsadit 2 nebo 4 byty. Pokud tedy potřebujete mít jistotu, že na různých platformách zabere proměnná 2 byty, můžete použít odvozený typ short int, který by měl tomuto požadavku vyhovět vždy. Lze pro něj také použít zkrácené jméno short. Dalším celočíselným typem je long int. I u tohoto typu je možné použít zkrácené long. Nejmenším typem, kterým je možno reprezentovat celá čísla je typ char, který zabere v paměti jeden byte a jak je již z jeho názvu patrné, používá se často k ukládání znaků. Ty jsou pak v proměnných uloženy jako ascii kódy znaků a proto s nimi lze i nadále pracovat jako s čísly.
Použitím slov signed a unsigned ve specifikaci typu proměné pak rozhodujeme o znaménkovosti typu. Jak asi tušíte, použitím signed si vynutíme, aby typ proměnné byl znaménkový a naopak unsigned znamená, že výsledný typ bude neznaménkový. Pokud tato slova nepoužijeme, můžeme se spolehnout, že typy int, short a long budou implicitně považovány za signed, nicméně u typu char záleží na konkrétní implementaci překladače a tedy se nelze spolehnout na to, že je typ char implicitně znaménkový, nebo neznaménkový (pokud ovšem nepracujete výhradně v jednom překladači, o kterém víte jak tento typ implementuje).
typ | dolni mez | horni mez | velikost (v bytech) |
unsigned char | 0 | 255 | 1 |
signed char | -128 | 127 | 1 |
unsigned short int | 0 | 65 535 | 2 |
signed short int | - 32 768 | 32 767 | 2 |
unsigned int | 0 | 65 535 | 2 |
signed int | - 32 768 | 32 767 | 2 |
unsigned long int | -2 31 | 2 31 -1 | 4 |
signed long int | 0 | 2 32 | 4 |
Tabulka ukazuje maximální reprezentovatelné hodnoty pro různé typy a také paměť, kterou objekty těchto typů alokují. problémem je, že norma jazyka C (ansi) nijak přesně tyto hodnoty nevymezuje. Údaje v tabulce by měly platit pro 16-bitové překladače. V 32-bitovém prostředí bude mít např. int parametry long int. Různé překladače se také mohou lišit rozdílnou implementací záporných čísel a proto se maximální přípustné hodnoty mohou lišit o 1. Naštěstí má každý překladač v souboru limits.h předdefinováné konstanty pro maximální hodnoty typů. Např maximální intová hodnota se dá zapsat pomocí konstanty INT_MAX.
reálné typy
V C existují tři typy reprezentující reálná čísla. Nejúspornější z nich, co se paměti týče, je typ float, který ale většinou neposkytuje dostatečnou přesnost. Tu by měl ve většině případů zajistit typ double. Stejně jako by se měl mezi celočíselnými typy preferovat int, mezi reálnými by to měl být typ double. Pokud budeme potřebovat ještě větší přesnost, poskytuje nám jazyk C ještě typ long double. Následující tabulka ukazuje rozsahy a alokovanou paměť jednotlivých reálných typů.
typ | maximum | přesnost (počet desetinných míst) | velikost |
float | 3.40282 . 1038 | 6 | 4 |
double | 1.79769313486232 . 10308 | 15 | 8 |
long double | 1.18973149535723176 . 104932 | 19 | 10 |
Číselné konstanty
Jazyk C rozlišuje mezi třemi typy celočíselných konstant. Prvním typem jsou konstanty dekadické, které jsou tvořeny libovolným řetězcem číslic, který nezačíná nulou a který ještě může předcházet znaménko ‘+’, nebo ‘-‘.
12; -548,
Naopak konstanty, které nulou začínají jsou interpretovány jako octalová čísla, tedy čísla zapsaná v osmičkové soustavě. Je jasné, že použitelné znaky náleží intervalu 0-7.
14 (octalový zápis dekadického čísla 12)
Konstanty můžeme zapsat ještě v hexadecimálním tvaru tak, že před samotné hexadecimální číslo připojíme prefix 0x, nebo 0X.
0x15 (21 dekadicky) 0X3e 0xEF
Všechny konstanty jsou typu int. Vyjímku tvoří ty konstanty, které se nevejdou do rozsahu čísel int a proto musí být nějakého jiného typu s dostatečným rozsahem (např. long int). Typ konstanty můžeme ještě explicitně ovlivnit sufixy U a L (na velikosti nezáleží. (stále mluvím o sufixech :-))). Sufix ‘U’ určuje, že konstanta bude neznaménkového typu (unsigned) a ‘L’ zase vynucuje použití typu long int. Oba sufixy se mohou v libovolném pořadí kombinovat.
15L (konstanta typu long int) 65984Ul (konstanta typu unsigned long int)
Pro reálné konstanty existují dva způsoby zápisu. Prvním z nich je zápis ve tvaru s desetinnou tečkou.
1 (typ int!) 1.0 (typ double) .23 -.378 -125.5484
Druhou možností je použití semilogaritmického tvaru.
15e-6 485E5
Reálné konstanty jsou typu double, ale podobně jako v případě reálných konstant se použije reálný typ s větším rozsahem, pokud by typ double nebyl schopen hodnotu obsáhnout. A i pro reálné konstanty existují sufixy, kterými se dá výsledný typ ovlivnit. Jsou to znaky L a F. Sufixem L si vynutíme použití typu long double a sufix F mění typ na float.
3.6f -.99F 0.4858L
Definice proměnných
Teď, když už známe typy, můžeme si nadefinovat proměnné. Na rozdíl od Pascalu se v definici proměnné v C píše nejdříve typ proměnné, který je následován indentifikátorem. Celá definice je pak zakončena znakem “;”.
int a;
V příkladu jsme nadefinovali proměnnou ‘a’, která je typu signed int. Je ale možné definovat více proměnných najednou a to jednoduše tak, že jednotlivé identifikátory oddělíme čárkou a středník zapíšeme až za poslední identifikátor.
double p, q, r;
Definici proměnné lze hned také spojit s její inicializací. Proměnnou můžeme inicializovat libovolným výrazem, který je vyhodnotitelný v době vzniku proměnné.
short int a=1; long b=2*10+1, c; int d=INT_MAX;Tak to je pro dnešek všechno. Příště to bude... emm... To vlastně ještě nemám naplánováno, takže se nechte překvapit. :-)
Obsah seriálu (více o seriálu):
- Učíme se C (1. díl)
- Učíme se C (2. díl)
- Učíme se C (3.díl)
- Učíme se C (4. díl)
- Učíme se C (5.díl)
- Učíme se C (6.díl)
- Učíme se C (7.díl)
- Učíme se C (8.díl)
- Učíme se C (9.díl) - Řetězce
- Učíme se C (10.díl) - Vstupně výstupní funkce
- Učíme se C (11.díl) - Formátovaný výstup
- Učíme se C (12.díl) - Formátový specifikátor
- Učíme se C (13.díl)
- Učíme se C (14.díl) - Vícerozměrná pole
- Učíme se C (15.díl) - Ukazatele
- Učíme se C (16.díl) - Modifikátory paměťové třídy
- Učíme se C (17.díl) - Pole a ukazatel
- Učíme se C (18. díl) - Dynamická alokace paměti
- Učíme se C (19. díl) - Práce se soubory I.
- Učíme se C (20. díl) - Práce se soubory II.
- Učíme se C (21. díl) - Parametry funkce main()
- Učíme se C (22. díl) - Ukazatele na funkce
- Učíme se C (23. díl) - Složité deklarace a definice
- Učíme se C (24. díl) - Funkce s proměnným počtem parametrů
- Učíme se C (25. díl) - Bitové operátory a bitové pole
- Učíme se C (26. díl) - Datové typy enum a union
- Učíme se C (27. díl - závěr) - Programové moduly
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007