ceckovy kviz

Jan Waclawek konfera na efton.sk
Středa Září 6 22:00:21 CEST 2023


> Jazykově správná odpověď je, µe podmínka se vyhodnocuje po dekrementu 
> "i", protoµe v případě, µe by se měla vyhodnocovat před dekrementem, byl 
> by zápis "--i"

V obidvoch pripadoch sa to, ci sa pokracuje v cykle, vyhodnoti *po*
dekremente - ten dekrement je totiz vyraz, ktory sa vyhodnoti ("vykona")
ako prvy, zisti sa jeho vysledok ktory sa potom vyhodnocuje pre ucely
cyklu. 

Vysledok i-- je hodnota i *pred* dekrementom, vysledok --i je hodnota i
*po* dekremente. Toto je jedna z tych obskurit C, ktorym je dobre sa
vyhybat, a ktore skalni Ceckari miluju.

T.j. ak i ma na zaciatku hodnotu 1, tak ak je v podmienke cyklu for --i,
cyklus sa nevykona ani raz, lebo vysledok vyrazu je 0; ak je v podmienke
cyklu i-- cyklus sa vykona raz, lebo vysledok vyrazu je 1. Nova hodnota i
je v oboch pripadoch 0 a do i sa ulozi este predtym, nez sa vyhodnoti pre
ucely cyklu, t.j. predtym ako sa vykona prva instrukcia cyklu, ak sa ma
cyklus vykonavat.

Ak je i na zaciatku 3, tak po a = --i; bude mat aj i aj a hodnotu 2; po a =
i--; bude mat a hodnotu 3 a i hodnotu 2. V tomto pripade vsak nie je
urcene, v akom poradi sa vysledok bude ukladat do a a i (dolezite to je
len ked su a a i volatile t.j. napr. hardwareove registre; a vysvetlenie
je v pomerne zlozitom koncepte tzv. sequence points).

K povodnej otazke pana kolegu Labaja: ak by to ++j, ++k malo v druhom poli
toho for(), t.j. nie
>> for (; i--; ++j, ++k) {};
ale
>> for (; ++j, ++k;) {};

tak to je ten comma vyraz co bol spominany vcera: vyraz ++j sa vyhodnoti,
t.j. j sa inkrementuje a vysledok toho vyrazu (t.j. inkrementovana hodnota
j) sa zahodi; potom sa vyhodnoti vyraz ++k, t.j. k sa inkrementuje,
vysledok je inkrementovana hodnota k, a ta sa pouzije na ucely zistenia,
ci sa ma v cykle pokracovat (t.j. ak je nulovy, nepokracuje sa).

wek


--- Original Message ---------------
[OT]
Jazykově správná odpověď je, µe podmínka se vyhodnocuje po dekrementu 
"i", protoµe v případě, µe by se měla vyhodnocovat před dekrementem, byl 
by zápis "--i"
[/OT]




Protoµe pochopitelně i tohle je správný zápis:
a=i--;
a=--i;
a kupodivu "a" se bude li±it.

... a doufám, µe jsem to nenapsal obráceně...

Dne 06.09.2023 v 20:45 Ladislav Vaiz napsal(a):
> Podmínka je i--, ty inkrementy se dělají na konci cyklu.
> 
> L.
> 
> On 06.09.2023 20:42, Petr Labaj wrote:
>> Jsem programátor typu RISC (a nikoli CISC), takµe pouµívám jednoduché 
>> a jasné
>> konstrukce, které jsou jednoznačně definované, snadno pochopitelné
>> i programátorům v jiných jazycích a dobře přenositelné do jiného jazyka.
>> I za cenu, µe je to o pár řádků del±í.
>> Proto bych nikdy podobou konstrukci z jednoho postu nikdy nepouµil.
>> Ale zajímalo by mě, co vlastně znamená:
>> for (; i--; ++j, ++k) {};
>>
>> Jak se prosím vyhodnocuje ta podmínka?
>> Je to
>> ++j AND ++k
>> nebo
>> ++j OR ++k
>>
>> Nebo dokonce třeba na ++j při splnění !=0 uµ skončí ++k neprovede vůbec?
>>
>> Díky.
>> PL
> 



Další informace o konferenci Hw-list