Operace s datovými typy - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:

Java

Operace s datovými typy

java

12. srpna 2002, 00.00 | Dnes se podíváme na dokončení datových typů, přesněji řečeno to budou operace s datovými typy a jednotlivé operátory.

Již zde bylo zmíněno či na příkladech ukázáno, že deklarace se provádí způsobem:

     typ identifikátor;
// resp.
     typ identifikátor = hodnota

Před typem pak v obou případech mohou být uvedeny klíčová slova public, private, static aj., které nás zatím nezajímají. Protože se vesměs zabývají rozsahem platnosti proměnné.

Je nutno si uvědomit, že deklarací bez přiřazení hodnoty sice vytvoříte danou proměnou daného typu, ale není do ní předána žádná hodnota, tudíž začnete-li se na ní odkazovat, dříve než jí přiřadíte hodnotu, program pravděpodobně vygeneruje chybu.

Základní matematické operaci

Standardní Java používá 5 základních operací: sčítání, odečítání, násobení, dělení, a zbytek po dělení. S nimi lze provádět absolutně všechny potřebné výpočty. Případně lze doprogramovat další vámi požadované funkce. Java jich však již má řadu napsaných v třídě Math.

Operace

Popis

Příklad

sčítání 1 + 7
+ odčítání 3 – 5
* násobení 2 * 3
/ dělení 7. / 2.3
% zbytek po dělení 9.1 % 1.21

Většina těchto operací proběhne, tak jak předpokládáte. Jediným zádrhelem zřejmě bude dělení. Musíte si uvědomit, kterými datovými typy dělíte! Protože operace vám bude vracet celočíselný výsledek při dělení dvou intů a reálný v případě dělení floatů resp. double. Tudíž stejná operace, ale s jinými typy vrací různé výsledky viz. příklad.

     int i = 7 / 3; // výsledek je 2
     double i_2 = 7. / 3.; // výsledek je 2.3 periodické

Přetečení

Nezapomínejte si zvolit pro vaše proměnné nejvíce vyhovující typ. U celočíselných se vám bude ztrácet desetinná část. Taktéž vám nemusí pro velmi přesné výpočty postačovat float, který má jen řádově poloviční přesnost oproti double. Tato nepřesnost se projeví již v tak jednoduchém případě jako je tento: 1. / 3. * 3. nebude opět 3, ale pouze něco jí velice blízkého.

To ovšem není to k čemu jsem se chtěl dostat, jestliže si zvolíte nevhodný typ, může se vám stát, že se nevejdete do jeho intervalu a proměnná tzv. přeteče. To má za následek, že se dostanete na druhou stranu intervalu daného čísla např. k byte o hodnotě 126 přičtete 12 a nyní bude mít hodnotu –118!

     byte b = 126;
     System.out.println(b); // zobrazí +126
     b += 12;
     System.out.println(b); // zobrazí –118 a ne +138

Zmíněný příklad je typická začátečnická chyba, která se často velice špatně dohledává.

Poznámka autora: řešení přetečení nespočívá v deklaraci největšího možného typu. To má totiž jeden neblahý následek: s většími typy se program stává stále pomalejší.

Za běhu programu je samozřejmě možné se obrátit na daný datový typ a zeptat se ho na jeho minimální resp. maximální hodnotu. Umožňují to konstanty v daných třídách oněch typů.

     int i = Integer.MIN_VALUE;
     double d = Double.MAX_VALUE;

Další operátory

Vzhledem k tomu, že při psaní kódu potřebujete provádět operace s proměnou a výsledek má být opět hodnotou dané proměnné. Definuje Java stejně jako C, narozdíl od Pascalu, další operátory, které nám ušetří pár slov při psaní.

Operátor

Příklad

Význam

= x = x + y přiřazení hodnoty
+= x += y součet x = x + y
-= x -= y rozdíl x = x - y
*= x *= y násobení x = x * y
/= x /= y podíl x = x / y
%= x %= y zbytek po celočíselném dělení x = x % y
&= x &= y AND x = x & y
|= x |= y OR x = x | y
^= x ^= y XOR x = x ^ y
<<= x <<= y posun doleva x = x << y
>>= x >>= y posun doprava x = x >> y
>>>= x >>>= y posun doprava + zaplnění nulami x = x >>> y

Z tabulky je názorně vidět, že místo toho abych napsal x = x + y mohu napsat jen x += y a to se stejným významem.

Přírůstkové a úbytkové operátory

Vzhledem k tomu, že se často u celočíselných typů objevuje zvýšení či snížení proměnné o jedničku, byly vytvořeny další čtyři operátory pro zjednodušení zápisu.

Tři možné zápisy jednoho a toho samého:

     n = n +1;
     n += 1;
     n++;
// resp.
     ++n;

Jsou to operátory ++ resp. –– následované resp. předcházené identifikátorem proměnné. Jejich význam je dostatečné znám, proto to vezmu jen v rychlosti.

Je-li operátor za identifikátorem, i++, pak nejdříve vrátí hodnotu i a následně zvětší i o jedničku.

Je-li operátor před identifikátorem, ++i, pak se nejdříve zvýší i o jedničku a následně vrátí jeho hodnotu.

     int i = 7;
     System.out.println(--i + " a ted " + i); // 6 a ted 6
     i = 7;
     System.out.println(i-- + " a ted " + i); // 7 a ted 6
Priorita matematických operací

Priorita by měla být stejná a to ve všech případech jako v normálním počítání, takže násobení má přednost před sčítáním apod. Nejjednodušší pravidlo zní: nevíte-li závorkujte!

Přetypování

Opět po velmi dlouhé jízdě objížďkou se dostáváme k velmi důležité části programování a to přetypování proměnných.

Casting neboli česky přetypování je konverze jednoho datového typu na druhý např. z int na double. První možností přetypování je konverze z typu nižšího na vyšší např. byte na int. Takovéto konverze Java za vás provádí automaticky. Není nutno je nějak ošetřovat.

     byte b = 100;
     int i = b; // automatický převod na int

Upozornění: nezapomínejte myslet! Při dělení dvou celočíselných typů Java nemůže tušit, že chcete vrátit reálné číslo, musíte jí to naznačit přetypováním čísla na reálné.

Druhou variantou přetypování je konverze z vyššího typu na nižší. Zde je vždy nutné napsat přetypování. to má pro Java význam, že jste si vědomi toho, že při této konverzi může být ztraceno přesnost či rozsah čísla.

Obecný vzorec přetypování vypadá:

     (typ) hodnota

Hodnotou nemusí být jen číslo, ale také jakýkoliv identifikátor proměnné.

     double d = 3.49;
     float f = (float) d; // casting na float

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Java  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: