Prosba o pomoc - nechapu zapis v C

Pavel Kutina hw na prelude.cz
Pondělí Listopad 21 10:44:40 CET 2022


Díky všem, popravdě jsem na to čučel asi deset minut, než mi došlo, co to 
vlastně asi má dělat. Vzhledem k tomu, že nejsem fanouškem kryptického 
zápisu a nadto používám poměrně kvalitní klávesnice, nemám problém si to pro 
přehlednost přepsat do té "dinosauří" ozávorkované formy.

Jinak Davidovu připomínku s != beru, porovnání s nulou je čistší - sice je 
proměnná unsigned, ale ukládá se do toho mikročas z millis, takže bude 
vždycky kladná (a uptime takový, aby se to protočilo, se opravdu 
nepředpokládá :)

Díky moc, potěšilo mě, že ještě nejsem úplné pako :)

Pavel Kutina


----- Původní zpráva ----- 
Od: "David Obdrzalek" <David.Obdrzalek na mff.cuni.cz>
Komu: "HW-news" <hw-list na list.hw.cz>
Odesláno: pondělí 21. listopadu 2022 8:01
Předmět: Re: Prosba o pomoc - nechapu zapis v C


On 21 Nov 2022 at 7:10, Petr Simek wrote:
> On Mon, 21 Nov 2022, Pavel Kutina wrote:
>
> > if ( DecOff && DecOff < millis() )
>
> > if ( (DecOff > 0 ) && ( DecOff < millis() ) )
>
> Neni to kvuli ryzlosti kodu ?
Ne. Sice tyhle dva zápisy nemusejí být ekvivalentní, ale buď správná 
deklarace
Decoff anebo aspoň logika té aplikace, co Pavel zkoumá, to můžou zařídit. 
Správněji
by, pokud se bavíme o ekvivalenci, mělo být "if ( (Decoff != 0) ..."
(pokud Decoff je unsigned něco, tak ty dva výrazy výše jsou ekvivalentní, 
pokud by
mohlo mít zápornou hodnotu, tak nejsou, protože v první variantě se test na 
millis
udělá, kdykoli Decoff bude <0 nebo >0, zatímco ve druhé, kdyby Decoff bylo 
pod
nulou, první část podmínky už nebude splněna a druhá se ani nebude zkoušet).

> Rekl bych ze v tom druhem pripade dojde
> k testu te druhe zavorky a volani funkce millis() vzdy, ale v tom
> prvnim pripade jen kdyz je DecOff > 0 .
Ne. Logický výraz se vyhodnocuje podle priorit operátorů a tam, kde mají 
operátory
stejnou prioritu, striktně zleva doprava s tím, že jakmile je znám výsledek 
celého
výrazu, už se dál nevyhodnocuje. Takže "ne && cokoli && cokoli && ..." už 
nikdy
nemůže být "ano" a proto se ty cokoli nebudou vůbec vyhodnocovat. Obdobně 
"ano ||
cokoli" se už u prvního prvku ví, že to celkově bude splněno, a tedy se ty 
další
nebudou vůbec zkoumat.


To zkrácení Decoff != 0 na Decoff funguje tak, že při vyhodnocování logické 
podmínky
se element "spočte" a pokud je výsledek cokoli různého od nuly, je to 
splněno
("ano", "true", "platí"). Pokud je nula, neplatí. Takže explicitní test na 
nulovost
se nemusí psát, stačí se podívat na tu hodnotu jako takovou. Takže v C/C++ 
se to
prostě píše rovnou krátce. Je to asi jako kdybyste v Pascalu psali if A=true 
then
... místo if A then ... Přeloží se to oboje stejně, ale je to delší na zápis 
a
trochu méně přehledné a může to mást.

D.O.

_______________________________________________
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