Автор вопроса: freeloader | Web-сайт:freeloader.folder-pro.net | ICQ: 50804884
Недавно отыскал на wasm.ru статью "Идентификация IF...THEN...ELSE" в разделе исследование программ, автор статьи Крисс Касперски
Все везде было понятно до сих пор:
IF a==b THEN check_null
IF a!=c THEN continue
check_null:
IF a==0 THEN continue
...// код условия
continue:
...// прочий код
который в собранном виде выглядит как:
if (a==0) || (a==c) & (a!=0)
Сколько нидумал, ни как не мог дойти до такого же вида, получалось только вот это:
if (a==b) & (a!=0) || (a==c) & (a!=0)
Теперь поясню, при первой проверке на равенство a==b если истина то прыгаем на check_null, где идет еще одна проверка на a==0, нам нужен код условия, поэтому получается так: if (a==b) & (a!=0), если а==b ложно, то идет проверка на неравенство a!=c-если условие не удовлетворяется, то идет
опять тот же a==0, тем самым, если все это дело собрать, то получается вот что:
if (a==b) & (a!=0) || (a==c) & (a!=0),
Крис Касперски написал неверно?(с трудом верится) или же я что то не так понимаю?
А бинарные деревья он для кого рисовал? Там как раз и объясняется, как сворачивать сложные логические условия, получающиеся прямым просмотром. И, кстати, логический And в Си и в ассемблере &&, а не &.
Мне лень было искать конкретно, где Касперски такое написал, но собирается листинг, конечно, не так, потому что если a=0, тогда условие всегда неверное, а в собранном варианте всегда верное.
void CIfThenDlg::OnOK()
{
// TODO: Add extra validation here
int a;
int b;
int c;
b = 0;
a = 0;
c = 3;
if (((a == b) || (a == c)) && (a != 0)){
this->MessageBox("OK"
}
}
Не поленись и посмотри, что как бы там не стало мы всегда делаем проверку на равность нулю!!! И на картинке это изумительно видно...
//Вот сверху то, что у меня получилось, помоему должно быть так...
или не так?
так мне ктонить обяъяснит ошибку мою? если она у меня есть?