Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2012, 20:50   #1
mityi
 
Регистрация: 24.11.2008
Сообщений: 5
По умолчанию Странность при проверке Boolean

Имею такую проверку, на состояние компонентов,
но почему-то срабатывает положительный результат и там('Hello_1') и там('Hello_2'), почему так? кто может мне объяснить?

пример:
на форме три компонента, которые имеют значения

CheckBox1.Checked:=true,
CheckBox2.Checked:=false,
CheckBox3.Checked:=false


procedure Click(Sender: TObject);
begin

if (CheckBox1.Checked=true and CheckBox3.Checked=false) then
ShowMessage('Hello_1');

if ( CheckBox2.Checked=true and CheckBox3.Checked=true) then
ShowMessage('Hello_2');

end;

P\s: Только не надо писать то что нужно писать правильно, типа как положено а именно if ( (CheckBox2.Checked=true) and (CheckBox3.Checked=true)) then ....
я это и сам знаю так к в других языках например java по другому и недаст запустить код, но в паскале же дает все-таки, запускать в первом варианте, просто хочется узнать с чем это связано когда каждая из двух проверка дает положительный результат при не соответствии булевых выражений и встречался ли кто с такими проблемами?

Последний раз редактировалось mityi; 06.04.2012 в 22:16.
mityi вне форума Ответить с цитированием
Старый 06.04.2012, 20:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Приоритет операций каков? Сначала выполняются сравнения:
CheckBox1.Checked=true - дает истину
CheckBox3.Checked=false - тоже истина
Ну а истина and истина дает истину.
Вот и весь секрет. Приоритет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2012, 22:10   #3
mityi
 
Регистрация: 24.11.2008
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Приоритет операций каков? Сначала выполняются сравнения:
CheckBox1.Checked=true - дает истину
CheckBox3.Checked=false - тоже истина
Ну а истина and истина дает истину.
Вот и весь секрет. Приоритет.
Тогда по вашему получается, если продолжить, где вторая проверка осуществляется...
if CheckBox2.Checked=true - дает ложь
if CheckBox3.Checked=true - тоже ложь
ну а ложь and ложь дает истину.
Так что ли по вашему?
Типа как математика в начальных классах, при умножении двух отрицательных чисел, они дают положительное число?

Последний раз редактировалось mityi; 06.04.2012 в 22:20.
mityi вне форума Ответить с цитированием
Старый 06.04.2012, 22:28   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я просто предположил. Чтоб выяснить нужно отлаживать в CPU режиме. Там видно что происходит на самом деле, и желательно оптимизатор отключить. Не даром всетки придумали приоритеты для операций.

Смотри. Здесь
Цитата:
if ( CheckBox2.Checked=true and CheckBox3.Checked=true) then
Схема такая:
true and CheckBox3.Checked - дает ложь у and получается приоритет больше
CheckBox2.Checked=эта первая ложь - дает истину (ложь = ложь)
и эта истина=true - дает истину для всего IF
Т.е. Сначала отрабатывает and а потом равенства с лева на право
Цитата:
if (CheckBox1.Checked=true and CheckBox3.Checked=false) then
true and CheckBox3.Checked - Дает Ложь
CheckBox1.Checked=Эта ложь - дает ложь (первый чек включен)
Эта вторая ложь=false - дает истину (ложь = ложь)

Я просто ошибся в приоритетах - у and он больше, а после остальные операторы оперируют с результатами уже вычисленных операций.
Согласен?
I'm learning to live...

Последний раз редактировалось Stilet; 06.04.2012 в 22:34.
Stilet вне форума Ответить с цитированием
Старый 06.04.2012, 22:29   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

истина and истина дает истина
истина and ложь дает ложь
ложь and истина дает ложь
ложь and ложь дает ложь
истина or истина дает истина
истина or ложь дает истина
ложь or истина дает истина
ложь or ложь дает ложь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.04.2012, 22:45   #6
mityi
 
Регистрация: 24.11.2008
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
истина and истина дает истина
истина and ложь дает ложь
ложь and истина дает ложь
ложь and ложь дает ложь
истина or истина дает истина
истина or ложь дает истина
ложь or истина дает истина
ложь or ложь дает ложь
Извините, но мне кажется вы ВАЩЕ не вкурили?!

Поставьте у себя на форме чекбоксы,
CheckBox2.Checked:=false,
CheckBox3.Checked:=false

и на процедуру повести , проверку
if ( CheckBox2.Checked=true and CheckBox3.Checked=true) then
ShowMessage('Hello_2');

Что у вас выйдет?
вы написали
что ложь and ложь дает ложь
так? если вы так считаете, то проверьте пожалуйста код в эксплуатации!
mityi вне форума Ответить с цитированием
Старый 06.04.2012, 22:50   #7
mityi
 
Регистрация: 24.11.2008
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я просто предположил. Чтоб выяснить нужно отлаживать в CPU режиме. Т...

Смотри. Здесь
Схема такая:
...результатами уже вычисленных операций.
Согласен?
Извините, но я честно говоря не понял)))
mityi вне форума Ответить с цитированием
Старый 06.04.2012, 23:16   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

if (False=True and False=True) then действительное true возвращает
если согласно приоритетов то все правильно
1. (True and False)-->False
2. (False=False)-->True
3. (True=True)-->True

но так записать никогда в голову не приходило
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.04.2012, 00:12   #9
mityi
 
Регистрация: 24.11.2008
Сообщений: 5
По умолчанию

тогда получается, если за одними скобками находятся через "and" два отрицания, они будут давать, собственно, положительный результат, так ?

Цитата:
Сообщение от Аватар Посмотреть сообщение
но так записать никогда в голову не приходило
а как приходило записывать?
просто у меня ща что получается, там где я писал таки вещи как выше у меня некоторые проекты будут давать баг )),
придется исправляться, не ожидал такого сюрприза я от Delphi, другие компиляторы других языков в отличии от дельфи не дают "компилить" проект с подобными операциями.

Последний раз редактировалось Stilet; 07.04.2012 в 12:55.
mityi вне форума Ответить с цитированием
Старый 07.04.2012, 00:58   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
а как приходило записывать?
if CheckBox1.Checked and not CheckBox3.Checked then

ну в крайнем случае

if (CheckBox1.Checked=true) and (CheckBox3.Checked=false) then

а ваша запись равносильна этому

if ((CheckBox1.Checked=(true and CheckBox3.Checked))=false) then
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает Ajax при проверке формы! you-rick JavaScript, Ajax 1 03.07.2011 22:04
Проскакивает цикл при проверке Сокета vaan.sk C/C++ Сетевое программирование 0 24.05.2011 21:39
Ошибка при проверке программы Mihanches Работа с сетью в Delphi 12 19.09.2010 14:42
Ошибка при проверке суммы вода. Djanius Компоненты Delphi 2 16.08.2010 20:35
программное переключение словаря при проверке орфографии методами MS Word tojhto Общие вопросы Delphi 2 06.09.2008 01:54