Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno rozdíl v zápisu (booleovská hodnota)

Zdravím, potřeboval bych vysvětlit následující věc:

Mám následující deklarace a přiřazení:

int k, m = -2, n = 4, f = 0;
boolean b = false;

Dál mam tyto 2 výrazy:

b = (m >= n) && (n++ >= y);    hodnota n po tomto výrazu je 4
k = --m * n + m; k = -15;      hodnota m po tomto výrazu je -3

Nerozumím tomu, že v prvním výrazu zvětšuju n o jednu (n++), když si ovšem hned na další řádce n vypíšu, jeho hodnota je pořád 4.
A teď, v druhém výrazu zmenšuju m o jedno a když si ho potom vypíšu, už je jeho hodnota -3, čili se změnila. Proč se v předchozím výrazu hodnota nezměnila natrvalo? Má to nějaký dočinění s tím, že výstupem výrazu je booleovská hodnota?
Díky
Změna předmětu, původně: rozdíl v zápisu (Kráťa)

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Ok este raz, pred chvilou som to napisal naopak, tak som si to zmazal, ale v principe je to stejne:…
MM.. 02.01.2012 18:44
MM..
Prekladače vždy vyhodnocujú takéto logické výrazy zľava doprava - ak nie, tak je to chyba prekladača…
los 02.01.2012 23:19
los
Ano v C je && vzdy zlava doprava, ale nieco sa mi mari v hlave ze cosi bolo zprava dolava ale uz nev… poslední
MM.. 04.01.2012 01:54
MM..

Ok este raz, pred chvilou som to napisal naopak, tak som si to zmazal, ale v principe je to stejne:
v zlozenom podmienenom prikaze nikdy, opakujem NIKDY nemen premenne!

Ptz ak je u && lava strana FALSE, tak sa uz prava strana vobec nemusi testovat a ani sa netestuje t.j. nevykona sa ziadne n++ !!! Ptz FALSE && cokolvek je FALSE.

Ci prekladac testuje vyrazy zprava alebo zlava zavisi od prekladaca a z toho dovodu pisat nieco take do programu je absolutny vrchol neserioznosti a vytvaranie niecoho co funguje absolutne nahodne v zavislosti na pouzitom prekladaci, kto take nieco do programu napise tomu by som dozivotne zakazal programovat.

Prekladače vždy vyhodnocujú takéto logické výrazy zľava doprava - ak nie, tak je to chyba prekladača, ktorý nedodržiava štandard. V C++ sú jedinou výnimkou prípady, ak je operátor && alebo || preťažený, čo pri práci s booleanmi alebo v C nepripadá do úvahy. Toto konkrétne bude Java (podľa typu boolean), takže tam zasa nepripadá do úvahy preťažovanie operátorov. :-)

Ak by to tak nebolo, tak by si musel aj triviálne podmienky písať samostatne, napr. x != null && x->is_valid() by si musel rozbíjať do samostatných podmienok.

Ano v C je && vzdy zlava doprava, ale nieco sa mi mari v hlave ze cosi bolo zprava dolava ale uz neviem co a kde (ze by nieco v pascale? Neviem, uz sa mi to za 20rokov zhlavy vymazalo :D).

To co pises sa v C pouziva casto napr. if(pointer!=NULL && *pointer==neco) aj ked ja osobne toto nemam moc v laske, niekedy je lepsie na zaciatku urobit if(pointer==NULL) neco_je_sakra_blbo(); a nie to testovat zlozene ptz potom neni uplne jasne ze preco to robi to co robi, bude to robit stejnu vec v pripade ked je nieco sakra blbo alebo ked je vsetko ok a ma to preskocit na zaklade korektnej poziadavky, co su ale dve odlisne situacie. Apod. Zavisi od pripadu a od momentalnej paranoie programatora :)

Zpět do poradny Odpovědět na původní otázku Nahoru