« 1 2 »
Autor Zpráva
Z3NTIVA
Profil
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
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
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
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
aha,takže vždy např. neco ++
jen nechapu jak je možne že se to nepřičte...
Sir Tom
Profil
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
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
Z3NTIVA:
nechápeš.

ageCopy = age++;
jde rozepsat jako
ageCopy = age (26) // s touhle proměnnou se dále již nic nedělá
age = age + 1 (27)


ageCopy = ++age;
jde rozepsat jako
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
TomášK:
Tohle je přesně naopak

Ano máš pravdu, upsal jsem se :)
Z3NTIVA
Profil
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
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
ted to už chápu,ale jak je možné že pak vrátí uloženou hodnou a ne hodnotu s ++ ?
Witiko
Profil
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
jakto že navrati puvodni hodnotu ? :((ja to zas neechapu ...:( a proc v tom druhem prikladu vypise hodnotu novou ? :(
Witiko
Profil
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
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
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
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
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
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
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
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
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--;
můžu napsat
var a = 1,
    b = zvetsi() + zmensi();
    
function zmensi() {
  var temp = a;
  a -= 1;
  return temp;
};

function zvetsi() {
  var temp = a;
  a += 1;
  return temp;
};
a výsledek bude stejný.

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
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
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
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
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
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
Witiko:
javascript je vyšší jazyk, kód interpretovaný za běhu, ke kompilaci nedochází
Niektoré prehliadače JS kompilujú.
Petr ZZZ
Profil
[#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. :)
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0