Hlavní strana -> Programování v C -> 04. Výrazy a aritmetické operátory

04. Výrazy a aritmetické operátory

Tenhle díl měl být asi trošku dříve, ale doufám, že se nic tak závažného nestalo, když se objevil až teď. Co to jsou aritmetické operátory je snad všem jasné a pro ty, kterým není to jsou znaky pro sčítání, odčítání... Tohle už snad znají všichni a pokud ne, tak s touhle úrovní zkušeností nikdy programovat nebudou, protože v programech je nutné provádět různá dělení a násobení. Programování je prostě matematika, pokud zrovna nehodláte dělat nějaké slovníky, ale ani tam se bez matematiky neobejdete. No a jelikož jste se rozhodli zrovna pro C, tak se budem bavit o aritmetických operátorech v jazyce C. Jazyk C definuje více operátorů, než ostatní programovací jazyky. Znamená to také, že výrazy hrají důležitější roli než ve většině ostatních programovacích jazyků. Výrazy jsou kombinací operátorů a operandů. Dodržují také pravidla algebry, takže jsou všem dobře známé.

Operátor - význam
+   sčítání
-   odčítání
*   násobení
/   dělení
%   modulo, což je zbytek po celočíselném dělení

Všechny tyto operátory se dají použít se všemi datovými typy, kromě modula, jenž lze použít pouze s celočíselnými typy.

Ve výrazech je potom zapotřebí dávat pozor, protože * a / mají vyšší prioritu, než + a -. V praxi to znamená, že je nutné používat správně závorky. Například tyto výrazy dávají různé výsledky:

5*3+6     =21
5*(3+6)   =45

Je tedy vhodné používat závorky často. Někdy by mohly být zbytečné, ale zpřehledňují zápis. Například:

5*3-4/6-7+59*2-4 je totéž jako:

(5*3)-(4/6)-7+(59*2)-4  a ještě přehledněji:

(5*3) - (4/6) - 7 + (59*2) - 4  delší, ale jasnější

Další na co je třeba si dávat pozor, je konverze typů ve výrazech. Znamená to, že typ výrazu je "povýšen" na nejrozsáhlejší typ ve výrazu. Například pokud budeme sčítat dvě proměnné, jednu celočíselnou a druhou s pohyblivou řádovou čárkou, tak výsledek bude s pohyblivou řádovou čárkou a pokud budou oba celočíselné, tak výsledek bude také celočíselný. Proto pozor na:

10 / 3 = 3        /* správně by to bylo 3.333... */
8.52 * 3 = 25.56
10 % 3 = 1
12 % 4 = 0
toto nejsou příkazy a nekončí proto středníkem.

Výrazy a přiřazování do proměnných mohou obsahovat jiné proměnné.

int i,j,k;
float f;
char ch;

i = 5;            /* i má hodnotu 5 */
j = i + 5;        /* j má nyní hodnotu 10 */
f = j * i - 24;   /* f obsahuje 26 */
ch = 14 - j;      /* ch má 4 */

Může se vám zdát divné to, že do proměnné ch typu char jsem přiřadil číslo, když char je přece znakový typ. On to je znakový typ, jenomže jak se to vezme. Má šířku 8 bitů, takže jako signed (standardně) může obsahovat hodnoty v rozmezí -128 až 127. Proč ale funguje jako úschovna znaků? Pokud vám říká něco ASCII tabulka, podle které počítač provádí převody mezi čísly a znaky, tak máte vyhráno. Je to tabulka, ve které jsou jednotlivé znaky a jim jsou přiřazeny celočíselné hodnoty. Například velké A má hodnotu 65, velké B 66. Lze tedy proměnné typu char použít pro uložení "malého celého čísla". Můžeme tak provádět lehce převody malého celého čísla na znak a zpět. Příklad nám ukáže, jak toho dosáhnout.

#include <stdio.h>

void main void
{
   char ch;

   ch = 65;
   printf("Hodnota %d odpovida znaku %c.\n", ch,ch);
   ch = ch + 1;
   printf("Hodnota ch je %d a odpovida znaku %c.\n", ch,ch);

   printf("Zadejte jeden znak.\n");
   scanf("%c", &ch);
   printf("Znak %c ma ASCII kod %d.\n", ch,ch);
}

V obou dvou prvních případech je ch vypisováno jednou jako celé číslo a jednou jako znak, aby se dokázalo, že A = 65, B = 66. Konečně poslední dvojice příkazů jeden znak z klávesnice načte a vypíše jeho ASCII hodnotu jako číslo.
Jeden příkaz není napsaný zrovna profesionálně a dá se zapsat jinak. Ikdž nejvíc záleží na tom, jaký zápis programátorovi nejvíce vyhovuje. Často se ale používá místo příkazů jako:

num = num + 4;
count = count + num;
f = f / 7.34;
d = d * 2;

Jejich zkrácených ekvivalentů:

num += 4;
count += num;
f /= 7.34;
d *= 2;

Zapomenout bych neměl ani na operátory inkrementace a dekrementace. Zvyšují (snižují) danou proměnnou o 1. Znamená to, že nahrazují příkazy jako i = i+1; i = i-1; Zapisují se jako zdvojení znaménka + nebo -. Jejich použití je zřejmé: lépe to vypadá, je to kratší a překladač může vytvořit rychlejší kód. Dá se toho využít hlavně v cyklech, o kterých budu psát v některém dalším díle, kde je povětšinou zapotřebí zvyšovat nebo snižovat právě o 1.

i = 5;
i++;   /* i má hodnotu 6 */
i--;   /* i má hodnotu zase 5 */

 Někdy se také můžete setkat s podobným tvarem.

i = 5;
++i;   /* i má hodnotu 6 */
--i;   /* zpátky 5 */

No a jaký je v tom tedy rozdíl? Jinak se tomu říká - podle toho, jestli jsou operátory před nebo za proměnnou se jim říká prefixové nebo postfixové. Významový rozdíl v tomto případě není žádný, je ale rozdíl v tom, kdy se daná proměnná inkrementuje/dekrementuje. Pokud je zdvojené znaménko až za proměnnou, tak se nejdříve použije hodnota proměnné a potom se zvýší o 1. Tady to nebylo zřejmé, ale vyjde to najevo v těchto příkazech:

int i = 5;
printf("Hodnota i je %d",i);
printf("Hodnota pri i++ je %d",i++);
printf("Hodnota pri ++i je %d",++i);

Hodnota proměnné se při provádění těchto příkazů mění takto. První printf vypíše, že hodnota i je 5. Druhý vypíše taky, že i je 5 a po použití (vypsání hodnoty) proměnné se její hodnota zvýší (na 6) a ve třetím printf je hodnota 6 ještě před vypsáním zvýšena a proto se vypíše 7. Tohle si vyzkoušejte sami, ať se moc nenudíte. Obsah nadpisu jsem snad vyčerpal, takže zase v dalším díle o něčem jiném. K.

Zpět

Programování v C | CZ 175/477 | Mapa stránek
Bc. Petr Klimánek, student Ostravské univerzity v Ostravě