ceckovy kviz

František Burian BuFran na seznam.cz
Čtvrtek Září 7 07:07:32 CEST 2023


Nekonecne cykly by programy nemely obsahovat, a pokud, mely by byt oznaceny for(;;), je to v norme (nevim jak C ale C++ urcite).

Kompilator muze na zaklade postupnosti sekvence uplne eliminovat nekonecnou smycku. V norme je totiz napsano ze well-formed program vzdy prochazi programem kupredu
a dobry optimizer toto muze vzit do uvahy, pokud v nekonecne smycce neni zadny prikaz ktery by mel side effect (ktery kompilatory rika tady to muze skoncit 
jinak) tak tu
smycku uplne zrusi.

Typickym prikladem jsou neumele breakpointy typu:

int fail = /*podminka*/;

while(fail) {}; /// kotva pro debugger

ktere funguji v debugu ale release je muze preskocit a program vesele pokracuje dal - je vyoptimalizovana i fail s volanim funkce a jejimi side effecty protoze 
fail se nikde nepouziva !!!;

mezi side effecty patri pristup k volatile promenne, prave ty ++ a -- a volani funkce, takze se s timto setkavaji programatori malo, na webu lze dohledat 
zajimave konstrukce
kdy kompilator odstrani celou smycku bez nahrady i se svym obsahem, ktery ale mel zmenit obsahy lokalnich promennych a nezmenil je.

Problem definice side effectu a programatorskeho chapani je v tom ze programatori mysli ve "scope" a side effectje definovany jinak, nezavisle na scope.

tedy, pokud nekonecnou smycku, tak for(;;) protoze tak je to definovano normou a jde zapnout extension prekladace ze toto vyoptimalizovat nema. Pro stoprocentni
jistotu dovnitr minimalne jeden volatile nop.

S pozdravem,

   Frantisek Burian

Dne 06. 09. 23 v 20:46 Jaroslav Buchta napsal(a):
> Prazdna je podle me inicializacni cast, podminka je i-- a ++j ++k je modifikace na konci iterace. Cili se cyklus provede tolikrat, jaka je na vstupu hodnota i?
> Zajimalo by me, jestli radeji pouzivate pro nekonecne cykly konstrukci for (;;) nebo while(1) a jestli je oboje vzdy OK.
>
> Dne 06.09.2023 v 20:42 Petr Labaj napsal(a):
>> 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
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list