|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.04.2012, 20:50 | #1 |
Регистрация: 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. |
06.04.2012, 20:56 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Приоритет операций каков? Сначала выполняются сравнения:
CheckBox1.Checked=true - дает истину CheckBox3.Checked=false - тоже истина Ну а истина and истина дает истину. Вот и весь секрет. Приоритет.
I'm learning to live...
|
06.04.2012, 22:10 | #3 | |
Регистрация: 24.11.2008
Сообщений: 5
|
Цитата:
if CheckBox2.Checked=true - дает ложь if CheckBox3.Checked=true - тоже ложь ну а ложь and ложь дает истину. Так что ли по вашему? Типа как математика в начальных классах, при умножении двух отрицательных чисел, они дают положительное число? Последний раз редактировалось mityi; 06.04.2012 в 22:20. |
|
06.04.2012, 22:28 | #4 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Я просто предположил. Чтоб выяснить нужно отлаживать в CPU режиме. Там видно что происходит на самом деле, и желательно оптимизатор отключить. Не даром всетки придумали приоритеты для операций.
Смотри. Здесь Цитата:
true and CheckBox3.Checked - дает ложь у and получается приоритет больше CheckBox2.Checked=эта первая ложь - дает истину (ложь = ложь) и эта истина=true - дает истину для всего IF Т.е. Сначала отрабатывает and а потом равенства с лева на право Цитата:
CheckBox1.Checked=Эта ложь - дает ложь (первый чек включен) Эта вторая ложь=false - дает истину (ложь = ложь) Я просто ошибся в приоритетах - у and он больше, а после остальные операторы оперируют с результатами уже вычисленных операций. Согласен?
I'm learning to live...
Последний раз редактировалось Stilet; 06.04.2012 в 22:34. |
||
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 | |
Регистрация: 24.11.2008
Сообщений: 5
|
Цитата:
Поставьте у себя на форме чекбоксы, CheckBox2.Checked:=false, CheckBox3.Checked:=false и на процедуру повести , проверку if ( CheckBox2.Checked=true and CheckBox3.Checked=true) then ShowMessage('Hello_2'); Что у вас выйдет? вы написали что ложь and ложь дает ложь так? если вы так считаете, то проверьте пожалуйста код в эксплуатации! |
|
06.04.2012, 22:50 | #7 |
Регистрация: 24.11.2008
Сообщений: 5
|
|
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 |
Регистрация: 24.11.2008
Сообщений: 5
|
тогда получается, если за одними скобками находятся через "and" два отрицания, они будут давать, собственно, положительный результат, так ?
а как приходило записывать? просто у меня ща что получается, там где я писал таки вещи как выше у меня некоторые проекты будут давать баг )), придется исправляться, не ожидал такого сюрприза я от Delphi, другие компиляторы других языков в отличии от дельфи не дают "компилить" проект с подобными операциями. Последний раз редактировалось Stilet; 07.04.2012 в 12:55. |
07.04.2012, 00:58 | #10 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
ну в крайнем случае if (CheckBox1.Checked=true) and (CheckBox3.Checked=false) then а ваша запись равносильна этому if ((CheckBox1.Checked=(true and CheckBox3.Checked))=false) then
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не работает 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 |