spse:pm1:cpp-operatory

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
spse:pm1:cpp-operatory [2020/12/07 19:21] – [Operátor přiřazení] jendaspse:pm1:cpp-operatory [2024/07/07 16:48] (aktuální) – upraveno mimo DokuWiki 127.0.0.1
Řádek 1: Řádek 1:
-====== Operátory ======+~~NOCACHE~~ 
 +~~REVEAL theme=dokuwiki&transition=convex&controls=1&show_progress_bar=1&build_all_lists=1&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1280x960~~ 
 + 
  
 ====== Operátory ====== ====== Operátory ======
Řádek 6: Řádek 9:
 ===== Operátor přiřazení ===== ===== Operátor přiřazení =====
 Jedná se o základní, ale zřejmě nejčastěji používaný operátor a značí se rovnítkem ''='' Jedná se o základní, ale zřejmě nejčastěji používaný operátor a značí se rovnítkem ''=''
 +---->
 <code c> <code c>
 int x; int x;
Řádek 13: Řádek 17:
  
 </code> </code>
-Máme proměnnou x, které je přiřazena hodnota 7. Při výpisu se zobrazí "7".+Proměnné x, je přiřazena hodnota 7. Při výpisu se tedy zobrazí "7".
  
 +<----
 +---->
 <code c> <code c>
 int x,y,z; int x,y,z;
Řádek 20: Řádek 26:
 y = x; //proměnné y je přiřazena hodnota proměnné x, tedy 7 (x=7;y=7;z=0) y = x; //proměnné y je přiřazena hodnota proměnné x, tedy 7 (x=7;y=7;z=0)
 z = 3; //proměnné z je přiřazena hodnota 3 (x=7;y=7;z=3) z = 3; //proměnné z je přiřazena hodnota 3 (x=7;y=7;z=3)
-x = y+z; //proměnné x je přiřazen součet hodnot proměnných y a z (x=10,y=7,z=3)+x = y + z; //proměnné x je přiřazen součet hodnot proměnných y a z (x=10,y=7,z=3)
 printf("%d\n",x); printf("%d\n",x);
  
 </code> </code>
  
-Tento příklad je už o něco složitější, nicméně stačí si uvědomit, že u přiřazení platí pravidlo right to left, neboli zprava doleva. Znamená to, že hodnota pravé strany je přiřazována levé straně. Příklad:+  * u přiřazení platí pravidlo right to left, neboli zprava doleva.  
 +  * Znamená to, že hodnota pravé strany je přiřazována levé straně. 
 +<---- 
 +----> 
 +==== Pravidla přiřazení ====
  
 <code c> <code c>
Řádek 33: Řádek 43:
  
 </code> </code>
-Hodnota proměnné ''x'' je samozřejmě 7. Tato hodnota je zprava postupně předávána všem proměnným. +  * Hodnota proměnné ''x'' je samozřejmě 7.  
 +  * Tato hodnota je zprava postupně předávána všem proměnným. 
 +<----
 ===== Aritmetické operátory ===== ===== Aritmetické operátory =====
  
-Tyto operátory zná každý člověk již od první třídy základní školy. Jedná se o operace jako sčítaní a odčítání či dělení a násobení. Patří sem však také operace modulo, která nemusí být každému známá+  * Jedná se o operace jako sčítaní a odčítání či dělení a násobení.  
 +  * Patří sem však také operace modulo. 
 +<fragment-block>
 ^ OPERÁTOR ^ VÝZNAM  ^ ^ OPERÁTOR ^ VÝZNAM  ^
 | + | sčítání  | | + | sčítání  |
Řádek 45: Řádek 57:
 | / | dělení  | | / | dělení  |
 | % | modulo (zbytek po dělení)  | | % | modulo (zbytek po dělení)  |
 +</fragment-block>
 +---->
  
-Operaci modulo si pro jistotu vysvětlíme na následujícím příkladu: +<fragment-block>
 <code c> <code c>
 int x; int x;
 x = 10 % 3; x = 10 % 3;
 printf("%d\n",x); printf("%d\n",x);
 +// output: "1"
 </code> </code>
 +</fragment-block>
 +  * Proměnné ''x'' je přiřazen výsledek operace ''10 % 3'' - zbytek po dělení třemi. 
 +  * Pokud podělíme číslo 10 třemi, dostaneme výsledek 3 a zbytek 1 - tento zbytek je výslednou hodnotou.
 +  * Tímto způsobem lze například snadno zjistit, zda je číslo sudé nebo liché ''(19 % 2 = 1; 22 % 2 = 0)''.
 +<----
  
-Proměnné ''x'' je přiřazena hodnota ''10 % 3'', což znamená zbytek po dělení třemi. Tedy pokud podělíme číslo 10 třemi, dostaneme výsledek 3 a zbytek 1 - tento zbytek je výslednou hodnotou. 
- 
-Tímto způsobem lze například snadno zjistit, zda je číslo sudé nebo liché (19 % 2 = 1; 22 % 2 = 0). 
  
 ==== Složené přiřazení ==== ==== Složené přiřazení ====
  
-Jednoduchý operátor přiřazení již známe, proto se můžeme podívat na přiřazení složené. Bez znalosti operátorů složeného přiřazení se však bez problémů obejdeme, jedná se pouze o zjednodušení zápisu. Například:+  * Jedná se pouze o zjednodušení zápisu.  
 +    * ''x += y;'' má stejný význam jako''x = x + y;'' 
 +  * Obdobné je to i s dalšími složenými operátory: 
 +    * ''-=, *=, /=, %=, >>=, <<=, &=, ^=, |=''
  
-''x +y;'' +==== Inkrementace a dekrementace ====
-má stejný význam jako: +
-''x + y;'' +
- +
-Obdobné je to i s dalšími složenými operátory: ''-=, *=, /=, %=, >>=, <<=, &=, ^=, |='' +
- +
-Inkrementace a dekrementace +
-Pokud proměnnou inkrementujeme, znamená to, že její hodnotu zvýšíme o 1. Naopak dekrementovat znamená snížit hodnotu o 1. Inkrementace se značí ''++'' (např.: ''a++;'') a dekrementace ''--'' (např.: ''a--;'').+
  
 + * Inkrementace se značí ''++'' (např.: ''a++;'') a dekrementace ''--'' (např.: ''a--;'') a používá se ke zvýšení nebo zvýšení hodnoty proměnné o 1.
 +<fragment-block>
 <code c> <code c>
 x++; x++;
-</code> 
-Tento zápis má stejný význam jako zápis ''x = x + 1;''. U dekrementace je pouze rozdíl ve znaménku. Operátory pro inkrementaci a dekrementaci lze zapsat jednak za proměnnou (postfix), ale i před proměnnou (prefix), tedy ''x++'' nebo ''++x''. Tyto dva zápisy mají relativně stejný význam. Ovšem při přiřazování se liší: 
- 
-<code c> 
-int x,y; 
-y = 2; 
-x = ++y; 
-printf("%d\n",x); 
  
 </code> </code>
- +Tento zápis má stejný význam jako zápis ''x = x + 1;'' 
-Pokud použijeme prefixový způsob zápisu, bude proměnné ''x'' přiřazena hodnota 3, jelikož při přiřazování nejprve došlo k inkrementaci proměnné ''y'' a až poté k přiřazení. +</fragment-block>
- +
-<code c> +
-int x,y; +
-2; +
-= y++; +
-printf("%d\n",x); +
-</code> +
- +
-Pokud však použijeme postfixový zápis, bude proměnné ''x'' přiřazena hodnota 2, protože při přiřazování byla nejprve proměnné ''x'' přiřazena hodnota ''y'' (2) a až poté došlo k inkrementaci ''y''+
 ===== Relační operátory ===== ===== Relační operátory =====
  
-Relační operátory se používají pro vzájemné porovnání dvou ale i více proměnných. Porovnávat můžeme například zda jsou si hodnoty proměnných rovny nebo zda je jedna větší než druhá a podobně. +  * Relační operátory se používají pro vzájemné porovnání dvou ale i více proměnných.  
 +  * Porovnávat můžeme například zda jsou si hodnoty proměnných rovny nebo zda je jedna větší než druhá a podobně. 
 +<fragment-block>
 ^ OPERÁTOR ^ VÝZNAM ^ ^ OPERÁTOR ^ VÝZNAM ^
 | > | větší než  | | > | větší než  |
Řádek 106: Řádek 103:
 | == | je rovno  | | == | je rovno  |
 | != | není rovno  | | != | není rovno  |
-Výsledkem porovnání je vždy booleovská hodnota a to pravda nebo nepravda. Například: +</fragment-block> 
 +  * Výsledkem porovnání je vždy booleovská hodnota a to pravda nebo nepravda. 
 +---->
 <code c> <code c>
 int x,y; int x,y;
Řádek 117: Řádek 115:
 x/2 != y; //nepravda x/2 != y; //nepravda
 </code> </code>
- +<fragment-block> 
- +<WRAP center round important 100%>
-<WRAP center round important 60%>+
 Operátor ''='' neslouží pro porovnání rovnosti proměnných. Je třeba použít operátor ''==''. Operátor ''='' neslouží pro porovnání rovnosti proměnných. Je třeba použít operátor ''==''.
 </WRAP> </WRAP>
- +</fragment-block> 
 +<----
 ===== Logické operátory ===== ===== Logické operátory =====
-Logické operátory mají stejnou funkci jako spojka ve větě. Spojují několik výroků v jeden (složený výrok). Výsledkem je pravda nebo nepravda. Patří sem také operátor negace, který neguje logickou hodnotu výroku. Tedy z pravdy negací vznikne nepravda a naopak. Mezi logické operátory patří: +  * Logické operátory mají stejnou funkci jako spojka ve větě.  
 +  * Spojují několik výroků v jeden (složený výrok).  
 +  * Výsledkem je pravda nebo nepravda.  
 +  * Patří sem také operátor negace, který neguje logickou hodnotu výroku. Tedy z pravdy negací vznikne nepravda a naopak. 
 +<fragment-block>
 ^ OPERÁTOR ^ VÝZNAM ^ ^ OPERÁTOR ^ VÝZNAM ^
 | && | spojka a (and)  | | && | spojka a (and)  |
 | %%||%% | spojka nebo (or)  | | %%||%% | spojka nebo (or)  |
 | ! | negace  | | ! | negace  |
 +</fragment-block> 
 +---->
 Příklad: Mějme následující složený výrok: Příklad: Mějme následující složený výrok:
- 
 <code c> <code c>
 int x,y; int x,y;
Řádek 140: Řádek 140:
 ((x < y) && (y != x)); ((x < y) && (y != x));
 </code> </code>
-Operátor ''&&'' nám jednoduché výroky ''(x < y)'' a ''(y != x)'' spojuje v jeden složený výrok. Výslednou hodnotu výroku určíme z pravdivostních hodnot jednotlivých jednoduchých výroků.+  * Operátor ''&&'' nám jednoduché výroky ''(x < y)'' a ''(y != x)'' spojuje v jeden složený výrok.  
 +  * Výslednou hodnotu výroku určíme z pravdivostních hodnot jednotlivých jednoduchých výroků
 +  * Jednoduchý výrok ''(x < y)'' dává výslednou hodnotu pravda stejně jako výrok ''(y != x)''
 +  * Výslednou hodnotou složeného výroku je tedy pravda, jelikož pravda a pravda = pravda.  
 +<---- 
 +==== Pravdivostní tabulky: ==== 
 +<fragment-block> 
 +^ A ^ B ^  A && B  ^  A %%||%% B  ^ 
 +| 1 | 1 |  1  |  1  | 
 +| 1 | 0 |  0  |  1  | 
 +| 0 | 1 |  0  |  1  | 
 +| 0 | 0 |  0  |  0  | 
 +</fragment-block> 
 +  * Aby byl složený výrok se spojkou ''&&'' pravdivý, musí být pravdivé i všechny jednoduché výroky ze kterých je je tento výrok složen. 
 +  * Z pravdivostní tabulky spojky ''||'' vyplývá, že stačí aby byl pravdivý pouze jeden jednoduchý výrok.
  
-Jednoduchý výrok (x < y) dává výslednou hodnotu pravda stejně jako výrok (y !x). Výslednou hodnotou složeného výroku je tedy pravda, jelikož pravda a pravda pravda. Podívejme se na následující pravdivostní tabulky: +=== Negace ===
- +
-A B A && B +
-pravda pravda pravda +
-pravda nepravda nepravda +
-nepravda pravda nepravda +
-nepravda nepravda nepravda +
-Z této pravdivostní tabulky jasně vyplývá, že k tomu, aby byl složený výrok se spojkou && pravdivý, musí být pravdivé i všechny jednoduché výroky ze kterých je je tento výrok složen. +
- +
-A B A || B +
-pravda pravda pravda +
-pravda nepravda pravda +
-nepravda pravda pravda +
-nepravda nepravda nepravda +
-Naopak z pravdivostní tabulky spojky ''||'' vyplývá, že stačí aby byl pravdivý pouze jeden jednoduchý výrok. +
- +
-Pro úplnost si ukážeme ještě již zmiňovanou negaci:+
  
 <code c> <code c>
Řádek 167: Řádek 165:
  
 </code> </code>
- 
  
 Výslednou hodnotou je nepravda a to i přesto, že výrok 2 > 1 je pravdivý. Výsledná hodnota výroku je totiž negována. Výslednou hodnotou je nepravda a to i přesto, že výrok 2 > 1 je pravdivý. Výsledná hodnota výroku je totiž negována.
Řádek 173: Řádek 170:
  
 ===== Priorita operátorů ===== ===== Priorita operátorů =====
-Priorita operátorů má vliv na to, která operace se provede dříve. Příklad: +<fragment-block> 
 +<code c>
 int x; int x;
 x = 2 + 3 * 4; x = 2 + 3 * 4;
-cout << x << endl; +printf("%d\n",x); 
-Výsledkem je číslo 14, protože nejprve dojde k součinu čísel 3 a 4, jelikož násobení má větší prioritu než sčítání, až poté se přičte dvojka. +</code> 
- +</fragment-block> 
-Prioritu operátorů však vůbec nepotřebujete znát. Existuje jednoduchý trik a to závorky. Pokud tedy chceme, aby nejdříve došlo k součtu čísel 2 a 3, pomůžeme si závorkami: +  Výsledkem je číslo 14, protože nejprve dojde k součinu čísel 3 a 4, jelikož násobení má větší prioritu než sčítání, až poté se přičte dvojka. 
 +  Pokud tedy chceme, aby nejdříve došlo k součtu čísel 2 a 3, pomůžeme si závorkami: 
 +<fragment-block> 
 +<code c>
 int x; int x;
 x = (2 + 3) * 4; x = (2 + 3) * 4;
 cout << x << endl; cout << x << endl;
 Výsledkem je nyní číslo 20. Výsledkem je nyní číslo 20.
- +</code> 
-V C++ existují ještě další operátory. My si však nyní bohatě vystačíme z operátory, které jsme si uvedli v této lekci. +</fragment-block>
  • spse/pm1/cpp-operatory.1607368869.txt.gz
  • Poslední úprava: 2024/07/07 16:48
  • (upraveno mimo DokuWiki)