Umíme to s Delphi: 121. díl – zkrácené vyhodnocování logických výrazů

Diskuze čtenářů k článku

Adam  |  24. 05. 2004 13:30

jako poměrně zkušený programátor bych takovéto využívání zkráceného vyhodnocování booleoovských výrazů vůbec nedoporučoval...

viz příklad z textu:

if (MessageDlg('Chcete opravdu skoncit? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes)
and (MessageDlg('Je aktualni soubor ulozen? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then

z podmínky není na první podled patrné, že se druhé volání messageboxu nevykoná když uživatel vybere 'No'.
je to tedy mnohem lepši zapsat jako:
if (MessageDlg('Chcete opravdu skoncit? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
if (MessageDlg('Je aktualni soubor ulozen? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then

V případě, že by šlo o nějaký složitější výraz a volané funkce by měly vedlejší efekt tak je celkem dobře možné že v zápisu uděláte chybu ... a požadované vedlejší efekty za určitých podmínek neproběhnou
takovéto chyby se potom velice špatně hledají

rozumné je toto využít například při kontrole indexu pole:

const vel = 20;
var
pole = array[0..vel] of integer;

begin
size := vel;
i := 0;
while ((i hledana_hodnota)) do
i:= i + 1;


zde je šikovné, že máte zajištěno, že se nebudete odkazovat na políčko, které v poli není a nemusíte tuto podmínku zapisovat jako while + if

teď nevím, jestli je to v článku napsané, ale norma pascalu nenařizuje, aby překladače vyhodnocovaly výrazy zkráceně... čož znamená, že se na to ani nemůžete spolehnout bez toho aby jste nějak nastavovali parametry překladu

Souhlasím  |  Nesouhlasím  |  Odpovědět
Birkof  |  21. 03. 2004 12:12

Zdar, zdá se mi to téměř o ničem. Když vypnu zkrácené vyhodnocování, tak postrádají smysl logické operátory AND, OR, if if then atd.. To pak pro každou opičárnu mužu psát extra příkaz a je to takové celé matoucí.

Souhlasím  |  Nesouhlasím  |  Odpovědět
NkD  |  15. 03. 2004 12:35

vynatek z textu:

Pokud programátor nechal zapnuté zkrácené vyhodnocování (přepínač Complete boolean eval je vypnutý – nezatržený), vyhodnocování v tomto okamžiku končí a pravdivost výroku B se nezkoumá. Program pokračuje ve svém běhu následujícím příkazem a výraz C = A and B považuje za pravdivý.

konec vynatku.

spravne ma byt :   a vyraz C = A and B povazuje za nepravdivy.

Souhlasím  |  Nesouhlasím  |  Odpovědět
rookie  |  15. 03. 2004 13:12

autor nevyhodnocuje vyrok C = A and B

autor robi C := A and B a teda vyhodnocuje len vyrok A and B

r.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Vít  |  15. 03. 2004 11:21

No nevím, ale boolovskou algebru jsme probírali na ZDŠ. Od programátorů bych očekával, že aspoň základní školu absolvovali
I když při četnosti chyb typu buffer overflow - kdo ví

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jan Fiala  |  15. 03. 2004 13:30

To by ses divil, kolik ma programamtoru problem se slozitejsimi logickymi vyrazy, zvlast, kdyz tam das kombinace And, Or sem tam NOT a 20 zavorek...

Souhlasím  |  Nesouhlasím  |  Odpovědět
Bohouš  |  15. 03. 2004 10:18

V příspěvku je ukázáno, jak se projeví zkrácené vyhodnocování. Ale kdy a proč je vhodné použít úplné vyhodnocování výrazů?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Václav Kadlec  |  15. 03. 2004 10:37

Příklad bude uveden v přístím článku :)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jan Fiala  |  15. 03. 2004 08:22

Nemel by se takovy dotaz psat do OnCloseQuery a vyhodnocovat CanClose ? Jako ukazka vyhodnocovani logickych vyrazu to je dobre, jen to umisteni je matouci

Souhlasím  |  Nesouhlasím  |  Odpovědět
Václav Kadlec  |  15. 03. 2004 10:38

Mate pravdu, to by byla take moznost.



Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor