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