Страница: 1 | 2 | 3 |
Вопрос: Почему проверяется второй операнд And?
Добавлено: 30.09.07 22:15
Автор вопроса: Nytrogen
Народ! Я вроде как программирую много, и опыт вроде как есть, но такое я и правда первый раз вижу.
Sub TestDividing()
Dim a As Integer
a = 0
If (a <> 0) And (1 / a > 1) Then
MsgBox "All Right!"
End If
End Sub
Ежу понятно, что второе условие (1 / a > 1) проверять смысла не имеет. Но при выполнении выдаётся ошибка "Dividing by zero"!
Неужели всё так плохо???
Ответы
Всего ответов: 36
Номер ответа: 1
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #1
Добавлено: 30.09.07 22:55
Скажи, а если a = 0, 1 / a - это не деление на 0 ?
Номер ответа: 2
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #2
Добавлено: 30.09.07 22:58
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 01.10.07 06:06
VB это не C++, в нем логические выражения вычисляются полностью. Более того, даже в IIf оба значения вычисляются сразу, а только потом из них идет выбор.
Номер ответа: 4
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #4
Добавлено: 01.10.07 17:17
Arcady_XQST, ты бы основы программирования почитал для начала...
Sharp, это ж получается, что для решения этой проблемы приходится писать вложенные Ифы? Но ведь это ж классический пример! Не ожидал я такого от Visual Basic...
--> следовательно и Or и Xor туда же?
Номер ответа: 5
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #5
Добавлено: 01.10.07 17:49
А
Номер ответа: 6
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #6
Добавлено: 01.10.07 19:38
И о чём думали создатели VB? Мож кто-нить скажет, зачем это проверяется???
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 01.10.07 20:41
стоять бояться, батька пришел
Во-первых IIF это не конструкция языка, а всего-лишь функция, так что совершенно логично и очевидно что значения параметров перед передачей их функции должны быть вычеслены.
Во-вторых, даже на Си/С++ такое условие вполне может слететь, из-за оптимизации компилятором.
Таким образом, подвожу итог. Условие абсолютно неработоспособно. И хватить гнать на vb6, лучше займитесь своим стилем письма
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 02.10.07 03:24
Хрена, стандарт гарантирует ленивое вычисление слева направо.
Номер ответа: 9
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #9
Добавлено: 02.10.07 20:30
Ну насчёт функции IIF ясный пень, что всё вычисляется. А вот булевские выражения...
В Паскале, например, функция TestDividing (из первого сообщения) работает с успехом. Согласитесь, это всего-лишь недоработка Visual Basic!
Номер ответа: 10
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #10
Добавлено: 02.10.07 21:03
____ Не соглашусь.
____ Думаю, что и у одного и у другого стандарта есть одинаковое количество и плюсов и минусов. Лучше, когда есть выбор. По-моему, в PHP есть два вида логических операторов: одни из них "быстрые" и обрывают анализ за ненадобностью, а другие "медленные", но гарантирую вычисление всех частей выражения.
____ Я за выбор.
____ Не забывайте, кстати, что VB (до версии 6) — это изначально был только интерпретатор и выбор стандарта диктовался логикой "разборки" всего выражения. При этом, если поменять стадтарт, то некоторые программы на VB перестанут работать.
Номер ответа: 11
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #11
Добавлено: 02.10.07 23:26
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 03.10.07 04:24
Первый раз слышу.
Номер ответа: 13
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #13
Добавлено: 03.10.07 11:18
____ Однако, в PHP работают и &&, || и AND, OR.
____ Причём, у них разный приоритет.
____ Насчёт "быстрых" и "медленных" в PHP, видимо, ошибаюсь. Но в каком-то языке видел. Столько их развелось, что уже и не помню где. Сейчас напрягусь ...
____ В Java (и, естесственно в JavaScript).
____ Бинарные операторы &, &&, |, ||. Двойные — быстрые, одиночные — всегда вычисляют обе части выражения. Причём одиночные, применимо к числовым значениям, выполняют не логические действия, а поразрядные. Вот такая вот штуковина-морковина.
Номер ответа: 14
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #14
Добавлено: 03.10.07 20:06
Ну в общем ясно всё с Visual Basic'ом. Привыкать надо... Ну или On Error Resume Next ))
Номер ответа: 15
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #15
Добавлено: 03.10.07 20:47
____ Java, кстати, наиболее "молодой" язык и в нём предусмотрели более широкие возможности стандарта разборки логических выражений.
____ Видимо было достаточное количество пожеланий на эту тему.