Autor | Zpráva | ||
---|---|---|---|
Z3NTIVA Profil |
#1 · Zasláno: 24. 6. 2011, 23:31:17
Zdravím,našel jsem ve své knize o js něco,čemu nerozumím,proč to tak je.Mohli by jste mi s tím prosím pomoct ? :) Jedná se o "operetor",nevím jak to jinak nazvat,++.No,pojdmě rovnou k věci,V mé knize se píše následující...:(v závorkách jsou věci které sám dopisuji...:) )
var age = 26; age++; (toto chápu...) hodnota promněné age nyní bude 27. PŘED NEBO PO(nadpis) Operátor inkrementace nemusí být umístěn vždy vzadu-dá se umístit na začátek názvu proměnné var age = 26; ++age; Dostaneme sice stejný výsledek ,nicméně ve zpracování je jeden drobný rozdíl: hodnota age je inkrementována ještě předtím,než je přečtena hodnota proměnné.Toto nemá žádný efekt na kód uvedený výše,protože v něm nepouíváme hodnotu proměnné,ale zamyslete se nad těmito dvěma kódy: var age = 26; var ageCopy = age++; Hodnota ageCopy bude 26.(jakto,vždyt se to má přičíst o jednu ne ? ) var age = 26; var ageCopy = ++age; V tomto druhém kódu bude hodnota ageCopy rovna 27.(Zase nechápu proč...) Díky všem moc a rady :) S pozdravem,Z3 |
||
Zechy Profil |
#2 · Zasláno: 24. 6. 2011, 23:42:28
Já v tom rozdíl nevidim, je pouze rozdíl v tom jak se navyšuje, bud se to nejdřív přečte a navýší a nebo se to přičtě k tomu co tam, ikdyž nevíme co tam je
|
||
ShiraNai7 Profil |
#3 · Zasláno: 24. 6. 2011, 23:53:28
var cislo = 5; alert(cislo++); // vypise 5 alert(++cislo); // vypise 6 Pokud nepotřebuješ dříve proměnnou číst než inkrementovat, tak používej cislo++ - protože v tomto případě se nemusí aktuální hodnota proměnné ukládat v paměti na dočasném místě, aby mohla být navrácena. |
||
TomášK Profil |
#4 · Zasláno: 25. 6. 2011, 02:02:04 · Upravil/a: TomášK
ShiraNai7:
„Pokud nepotřebuješ dříve proměnnou číst než inkrementovat, tak používej cislo++ - protože v tomto případě se nemusí aktuální hodnota proměnné ukládat v paměti na dočasném místě, aby mohla být navrácena.“ Tohle je přesně naopak. ++cislo při vyhodnocení přičte promněnné číslo 1 a vrátí přímo proměnou číslo. cislo++ zkopíruje hodnotu cislo do tmp, do proměnné cislo přičte 1 a vrátí tmp. V praxi je dost jedno, co se používá, rozdíl je zanedbatelný. Na stackoverflow je i benchmark. |
||
Z3NTIVA Profil |
#5 · Zasláno: 25. 6. 2011, 09:51:44
aha,takže vždy např. neco ++
jen nechapu jak je možne že se to nepřičte... |
||
Sir Tom Profil |
#6 · Zasláno: 25. 6. 2011, 11:50:39
Z3NTIVA:
ageCopy = age++; „Hodnota ageCopy bude 26.(jakto,vždyt se to má přičíst o jednu ne ? )“ Protože do ageCopy ukládáš hodnotu age (26), ale pak to age zvýšíš o jednu -> tzn. na konci máš ageCopy = 26 a age = 27 (age se zvyšuje o jednu protože pouze u něho máš ++) ageCopy = ++age; age se zvýší o jednu a tato nová hodnota se uloží do ageCopy. -> na konci máš ageCopy = age = 27. Stačí si říct: age++ : Vrať mi nyní hodnotu proměnné a pak ji zvyš o jednu (protože pluska jsou později). ++age : Nejdřív zvedni hodnotu proměnné (pluska jsou vepředu) a pak mi ji vrať. |
||
Z3NTIVA Profil |
#7 · Zasláno: 25. 6. 2011, 16:37:43
no,ale vždyt by oboje melo vyjit 27 .protože age je 26 a ++ tzn. +1=27
a to druhe : ++ age =1 + age =27 ne ? |
||
panther Profil |
#8 · Zasláno: 25. 6. 2011, 16:41:57 · Upravil/a: panther
Z3NTIVA:
nechápeš. ageCopy = age++; ageCopy = age (26) // s touhle proměnnou se dále již nic nedělá age = age + 1 (27) ageCopy = ++age; age = age + 1 (27) ageCopy = age (27) A jestli ani teď nevíš, tak nepoužívej ++ , ale +1 . Víc polopaticky to napsat nejde.
|
||
ShiraNai7 Profil |
#9 · Zasláno: 25. 6. 2011, 17:16:52
TomášK:
„Tohle je přesně naopak“ Ano máš pravdu, upsal jsem se :) |
||
Z3NTIVA Profil |
#10 · Zasláno: 25. 6. 2011, 17:55:44
jsem asi demenstni ,ale pořad to nechapu...ja si pořad řikam,že je jedno ejstli to je 1 + 26 (++age) nebo 26+1 (age++)
|
||
ShiraNai7 Profil |
#11 · Zasláno: 25. 6. 2011, 18:10:17
Z3NTIVA:
++age je výraz, který přičte 1 k age a pak vrátí jeho novou hodnotu age++ je výraz, který si první uloží současnou hodnotu age, poté přičte k age 1 a nakonec vrátí onu uloženou hodnotu Tady není nic k nepochopení. |
||
Z3NTIVA Profil |
#12 · Zasláno: 25. 6. 2011, 19:01:46
ted to už chápu,ale jak je možné že pak vrátí uloženou hodnou a ne hodnotu s ++ ?
|
||
Witiko Profil |
#13 · Zasláno: 25. 6. 2011, 19:02:26 · Upravil/a: Witiko
var a = 1; alert(a++); // Vypíše 1 alert(a); // Vypíše 2 var a = 1; alert(++a); // Vypíše 2 alert(a); // Vypíše 2 V obou případech dojde k přičtení 1 k současné hodnotě proměnné, ale v prvním případě (a++ ) výraz navrátí původní hodnotu proměnné a v druhém (++a ) hodnotu novou. Stejně tak a-- a --a , žádnou vědu v tom není nutné hledat, oba výrazy provedou to samé, jen navrátí jinou hodnotu.
Proto při přiřazení do proměnné dojde k následujícímu: var a = 1, b = a++; // b je 1 Výraz a++ navýší hodnotu proměnné a z 1 na 2 a navrátí původní hodnotu (1 ). Do proměnné b je přiřazena tato navrácená hodnota, tedy 1 .
var a = 1, b = ++a; // b je 2 Výraz ++a navýší hodnotu proměnné a z 1 na 2 a navrátí novou hodnotu (2 ). Do proměnné b je přiřazena tato navrácená hodnota, tedy 2 .
|
||
Z3NTIVA Profil |
#14 · Zasláno: 25. 6. 2011, 19:07:52
jakto že navrati puvodni hodnotu ? :((ja to zas neechapu ...:( a proc v tom druhem prikladu vypise hodnotu novou ? :(
|
||
Witiko Profil |
#15 · Zasláno: 25. 6. 2011, 19:12:58
Z3NTIVA:
Trochu jsem se upsal, přečti si to teď. Každopádně [#13] je ten nejpolopatičtější způsob, jak dokážu problém vysvětlit. Oba výrazy ( proměnná++ a ++proměnná ) provedou to samé, ale první navrátí hodnotu proměnné před přičtením a druhý hodnotu proměnné po přičtení.
|
||
peta Profil |
#16 · Zasláno: 27. 6. 2011, 15:37:59 · Upravil/a: peta
Z3NTIVA:
i++; udela i = i + 1; ++i; udela i = i + 1; Rozdil je jen tehdy, kdyz to chces pouzit pro dalsi funkci. funkce(i++); udela funkce(i); i = i + 1; funkce(++i); udela i = i + 1; funkce(i); Je to proste takova finta, jak si usetrit psani, klidne to rozepis. Ja to take rozepisuji zvlast. |
||
Yur4Y Profil |
#17 · Zasláno: 27. 6. 2011, 16:01:15
peta:
„Rozdil je jen tehdy, kdyz to chces pouzit pro dalsi funkci.“ Rozdiel je všade, kde sa ďalej pracuje s návratovou hodnotou výrazu ++i, resp. i++. Rozhodne nie len "pro dalsi funkci". „funkce(i++); udela funkce(i); i = i + 1;“ Ani toto nie je pravda. V tele funkcie funkce sa skús pozrieť na hodnotu premennej i a porovnať tieto dva, podľa teba ekvivalentné, prípady. |
||
Witiko Profil |
#18 · Zasláno: 27. 6. 2011, 18:57:49 · Upravil/a: Witiko
peta:
„kdyz to chces pouzit pro dalsi funkci“ S návratovou hodnotou výrazů může pracovat víc věcí, než jen funkce. Pracuje s ní prakticky všechno. var a = 1, b = a++ + a--; // a -> 1; b -> 3; nebo třeba var a = 10; while(a--) { // provede se 10x } |
||
peta Profil |
#19 · Zasláno: 28. 6. 2011, 08:30:30 · Upravil/a: peta
Witiko - while je funkce. Scitani neni funkce, to je operace. Zajimavy priklad, to jsem take nikdy nepotreboval. i++ pouzivam vyhradne pro zkraceni i = i + 1 (tez i += 1). Pro slozitejsi veci mi prijde prehlednejsi to rozepisovat.
while: funkce(i--) se prepise jako funkce(i); i = i - 1; Do while se pise podminka, takze dokud bude i>0, tak je to true. Prvni hodnota je 10, pak 9,8,7,6,5,4,3,2,1 pri nule while cyklus ukonci. V cem presne, ze to odporuje? Kdyz to napisi jako i=10; while(i) {i = i-1;} Tak ze to take provede 10x ne? Resp uplny zapis pro while by byl: i=10; while(boolean(i)) {i = i-1;} Kde boolean je dalsi funkce. Yur4Y - Nevim, co chces rici. Viz priklady Witiko s alertem (#13)? Pouze jsem se pokusil zjednodusit vase slozite vyklady. Ano, urcite se to da vyuzit ruzne, ale komplikuje si tim praci. |
||
Yur4Y Profil |
#20 · Zasláno: 28. 6. 2011, 09:15:37
peta:
„while je funkce.“ Rozhodne nie je. „Nevim, co chces rici.“ Reagoval som na tvoje slová „funkce(i++); udela funkce(i); i = i + 1;“, v ktorých tvrdíš niečo, čo nie je pravda. |
||
Davex Profil |
#21 · Zasláno: 28. 6. 2011, 11:16:39
peta:
„while je funkce“ While není funkce. Je to iterační příkaz. „Do while se pise podminka“ Jako parametr iteračního příkazu while se uvádí výraz, takže nechápu, co tím chceš říct. „Kde boolean je dalsi funkce.“ boolean jako funkce v JavaScriptu neexistuje. Pořid si nějakou dobrou učebnici programování a pokus se, prosím, přizpůsobit svou terminologii okolnímu světu. |
||
TomášK Profil |
#22 · Zasláno: 28. 6. 2011, 11:38:01
Witiko:
> b = a++ + a--; > // a -> 1; b -> 3; S tímhle bych byl opatrný. Pokud si dobře pamatuju, v C tohle buď neprojde kompilátorem nebo má nedefinované chování, jak se to chová v javascriptu nevím, ale raději bych nepoužíval dvakrát inkrement na jednom řádku (přesněji mezi dvěma sequence points, ale cíl není řešit tu detaily). |
||
Witiko Profil |
#23 · Zasláno: 28. 6. 2011, 14:33:17 · Upravil/a: Witiko
TomášK:
Nevidím sebemenší důvod, proč by to mělo činit problémy, jedná se o výraz, který má svou funkci a návratovou hodnotu. Místo var a = 1, b = a++ + a--; var a = 1, b = zvetsi() + zmensi(); function zmensi() { var temp = a; a -= 1; return temp; }; function zvetsi() { var temp = a; a += 1; return temp; }; Srovnání s C je možná trochu mimo mísu, protože javascript je vyšší jazyk, kód interpretovaný za běhu, ke kompilaci nedochází, podobnost převážně pouze syntaktická. |
||
Joker Profil |
#24 · Zasláno: 28. 6. 2011, 15:15:58
TomášK:
„Pokud si dobře pamatuju, v C tohle buď neprojde kompilátorem nebo má nedefinované chování“ Ty operátory mají jasně danou prioritu a asociativitu, takže minimálně teoreticky je chování toho výrazu definované jednoznačně: Operátor + je asociativní zleva a má nižší prioritu než ++ a --, takže první se provede a++ (zvýší a, vrátí 1), pak a-- (sníží a, vrátí 2) a pak 1+2, vrátí 3. |
||
Davex Profil |
#25 · Zasláno: 28. 6. 2011, 15:38:35 · Upravil/a: Davex
TomášK:
V JavaScriptu s tím problém nebude. Joker: V C bude jiný výsledek. Při zapnutých optimalizacích překladač přeloží rovnou jako b = 2 .
|
||
TomášK Profil |
#26 · Zasláno: 28. 6. 2011, 15:46:45 · Upravil/a: TomášK
Joker:
Ohledně asociativity souhlasím, ale ta v tomhle případě nehraje roli. Z normy C99: Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. ... This paragraph renders undefined statement expressions such as i = ++i + 1; a[i++] = i; Operátor plus není sequence point. I porůznu na webu se jde dočíst, že to má nedefinované chování. Překladač to zřejmě přeloží nějak rozumně (podle toho, co on považuje za rozumné), zlý překladač odešle šéfovi výpověď a zformátuje disk (což je opravdu ošklivé nedefinované chování:)). Witiko: Ani ty funkce to v C nezachrání, opět není zaručené, v jakém pořadí se vyhodnotí. O javascriptu toho tolik nevím, tedy věřím Davexovi, že se to vyhodnotí dle očekávání. I tak mi nepřijde vhodné to používat, podobné chyby se často hledají dost obtížně. |
||
Witiko Profil |
#27 · Zasláno: 28. 6. 2011, 17:12:09 · Upravil/a: Witiko
TomášK:
Stále nevím, co by u javascriptu potenciálně bránilo jasné definici chování a = b++ + b--; Stačí, aby interpret postupoval z leva do prava.
|
||
TomášK Profil |
#28 · Zasláno: 28. 6. 2011, 18:01:22
Witiko:
„Stačí, aby interpret postupoval z leva do prava.“ V javascriptu se to zřejmě vyhodnotí správně, koukal jsem do specifikace ECMAscriptu a tam to definované je. V php je to definované pro operandy podle asociativity (tedy to, co popisoval Joker pro php platí), pro argumenty jsem to v dokumentaci nenašel, někde na fóru psali, že to není specifikované (tj. f($a++, $a++) může dopadnout všelijak). V C/C++ to nejde vůbec. Chci říct, že používá-li to někdo, pak by měl mít ověřené, že to v daném jazyku funguje, není to úplná samozřejmost. |
||
_es Profil |
#29 · Zasláno: 28. 6. 2011, 19:01:58
Witiko:
„javascript je vyšší jazyk, kód interpretovaný za běhu, ke kompilaci nedochází“ Niektoré prehliadače JS kompilujú. |
||
Petr ZZZ Profil |
#30 · Zasláno: 28. 6. 2011, 20:29:16 · Upravil/a: Petr ZZZ
[#14] Z3NTIVA:
„jakto že navrati puvodni hodnotu? ja to zas neechapu “ Já JavaScriptu nerozumím, ale podle toho, co tady píšou ostatní, předpokládám, že se to tak chová prostě proto, že je to tak "domluvené". Autor/autoři jazyka rozhodl/i, že se to tak bude chovat, tak se to tak chová. Asi to nechápeš proto, že v tom pořád hledáš analogii s aritmetikou, ale ta tam není. Zde jde o programovací jazyk a nějaká jeho pravidla. Ta pravidla říkají, že tento zápis provede tohle a tamten něco jiného. Na tom není nic k chápání, ale jen k akceptování a zapamatování. Podobně jako že „olovo“ je česky prvek Pb (Plumbum), ale rusky Sn (Stannum, česky cín). To taky nepochopíš, to si můžeš jedině zapamatovat. :) |
||
Téma pokračuje na další straně.
|
0