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)

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..
Aháá, tak proto :-) No takhle to máme ve zkušební písemce, tak jak jsem si to procházel tam mi to pr…
freez 02.01.2012 18:49
freez
Tak ale v tej pisemce musi byt aj uvedene ze jaky sa pouziva prekladac resp. mozno vas ucili ze neja…
MM.. 02.01.2012 19:09
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.

Tak ale v tej pisemce musi byt aj uvedene ze jaky sa pouziva prekladac resp. mozno vas ucili ze nejaky ten prekladac co pouziva ten vas profesor testuje vyrazy zprava, ja neviem zhlavy ktory prekladac testuje z ktorej strany ptz ma to nezaujima ptz talku haluz vzivote do zdrojaku nenapisem, ale vzdy sa najdu dementi ktori do zlozenych vyrazov nacpu napr. volania fcii ktore nieco menia apod. a potom sa divia. (P.S> v jednoduchom vyraze je to OK)

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