Proměnné trochu jinak

Sem vkládejte editovatelné kusy kódu a tutoriály.
Odpovědět
Uživatelský avatar
D-Sheep
Příspěvky: 768
Registrován: září 7, 2011, 10:17 pm
Facebook: http://facebook.com/sheepdave
Bydliště: Praha, CZE
Kontaktovat uživatele:

Proměnné trochu jinak

Příspěvek od D-Sheep » květen 28, 2015, 12:16 am

Ahoj lidi,
na základě mnoha nedávných dotazů v poradně, které se daly vyřešit jenom trochu větším pochopením proměnných, jsem se rozhodl napsat další povídání o proměnných tak, jak je vidím já.
Co je to proměnná?
už zase
Proměnná (nikoli proměna) je krabička v počítači, ve které je uloženo číslo. Někdy je tam ovšem i text. Na stole vedle notebooku mám peněženku. V ní je 300 korun. Jak to vidí GameMaker?

Kód: Vybrat vše

penize = 300;
Ten vidí krabičku se jménem penize a je v ní číslo 300.
Sestra si potřebuje půjčit stovku. Otevřu peněženku a vyndám z ní 100 korun. Co na to GM?

Kód: Vybrat vše

penize -= 100
Peněženka se zvenčí nijak nezměnila, ale její obsah je jiný! GM má teď v krabičce "penize" hodnotu 200.
Tu stovku ale budu chtít vrátit, ségra, pamatuju si to! Napíšu si to radši na papír. Na stole mi leží papírek z nápisem "Sestra - 100 Kč". GM mi na stole vytvoří novou krabičku.

Kód: Vybrat vše

dluh = 100;
Za pár dní mi sestra peníze vrací a já je schovávám zpět do peněženky. GameMaker mi s tím pomůže:

Kód: Vybrat vše

penize += dluh;
dluh = 0;
Tedy, obsah peněženky je opět v původním stavu a papírek s dluhem škrtám.

Tady jsem s krátkým příběhem popsal základní principy proměnných. Můžeme do nich ukládat hodnotu, pokud jsou na levé straně rovnítka a můžeme z nich hodnotu získávat, pokud jsou na pravé straně rovnítka.

Počítejme tedy s proměnnou penize, ve které je hodnota 300. Vytvoření takové situace je snadné. Použijeme operátor =, který se píše mezi dva výrazy. Co, že je to výraz? Je to buď nějaká konstantní hodnota, jako například číslo, nebo něco, z čeho můžeme určitým, námi pochopitelným způsobem číslo získat. Výraz 200 je roven číslu 200 a v tomto konkrétním případě je výraz penize roven číslu 300. Operátor = tedy vezme hodnotu výrazu vpravo a vloží jej do proměnné vlevo. V GameMaker Language (GML) to zapisujem takto:

Kód: Vybrat vše

penize = 400;
penize = vyplata;
//Ale nikoliv 1000 = penize, protože 1000 není proměnná
V předchozích příkladech jsme nejen ukládali do proměnných nějaké hodnoty, ale ke stávajícímu obsahu jsme i přidávali, i z něho odebírali. GML posktuje několik základních operátorů:

Kód: Vybrat vše

+=    pro přičítání
-=    pro odečítání
*=    pro násobení
/=    pro dělení
Nedávno jsem objevil, že GM zkousne i &=, |= a ^=, ale jejich význam je zcela mimo tento nenáročný článek.
Porovnávání proměnných
Koukám se na jídelníček mé oblíbené restaurace a chci vědět, jestli budu mít na dnešní oběd dost peněz. Nezajímá mě ani tolik přesná hodnota mého jmění, ale to, jestli se dnes najím. Chci vědět buď ano, nebo ne. GM zajímá buď 1, nebo 0. Poskytne mi k tomu sadu porovnávacích operátorů:

Kód: Vybrat vše

<     pro menší než
<=    pro menší nebo rovno
>     pro větší než
>=    pro větší nebo rovno
==    pro shodné s
!=    pro různé od
Takže najím se dnes teda?

Kód: Vybrat vše

obed = (penize >= cena);
Jak to mám vědět a hlavně jak tomu zápisu mám rozumět? Všechny výše vypsané operátory porovnají specifickým způsobem hodnoty výrazů vlevo a vpravo a jejich vypočítanou hodnotou je 0, nebo 1. S touto hodnotou potom manipuluje operátor =. Tedy i celý obsah závorky je výraz. Pokud tedy bude v proměnné penize větší hodnota nebo stejná jako v proměnné cena, uloží se do obed číslo 1.
Operátor =
Operátor = je podle mě nejpitomější věc GML. On se totiž vůbec nechová tak, jak je zvykem v podobných jazycích. Názorná ukázka: mějme proměnné m a n s hodnotami 2 a 3. Co byste řekli, že udělá následující příkaz?

Kód: Vybrat vše

m = n = 1;
Že nastaví obsah obou proměnných na číslo 1? No, tak to je bohužel špatně. Z nějakého důvodu se v nějak definovaných situacích operátor = chová stejně jako == ! On tedy zbytečně dělá práci navíc, čímž dokáže vyvést z míry každého programátora s dobrým přehledem.

Rozeberem si poslední příkaz. Profesionální mluvou je operátor = pravě asociativní, tedy pokud se jich v jednom výrazu nachází víc, vykonají se nejdříve ty nejvíce vpravo. Nyní nastoupí jeho temná stránka, která porovná proměnnou n s číslem 1. Ty se nerovnají a tak operátor = vypočítá hodnotu 0. Pokračuje se na další = nejvíc vpravo. To už se ale chová úplně jinak a proto po skončení příkazu zůstává v proměnné m hodnota 0. Bullshit. Proto, prosím, buďte ohleduplní a pro porovnání na shodnost vždy použijte ==, ať má ten neprávem utiskovaný chudák šanci.

Závěrem bych chtěl říct, že věřím, že tímto někomu pomůžu k hlubšímu pochopení tak základní programátorské dovednosti, jakou je používání proměnných a proto omluvte na první pohled nedůležitý článek.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host