Prosba o pomoc - nechapu zapis v C
David Obdrzalek
David.Obdrzalek na mff.cuni.cz
Pondělí Listopad 21 08:01:06 CET 2022
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.
Další informace o konferenci Hw-list