Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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
второе условие (1 / a > 1) проверять смысла не имеет
Что ты хотел этим сказать? Не стоит проверять, делится ли число "1" на "0" ?

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 01.10.07 06:06
VB это не C++, в нем логические выражения вычисляются полностью. Более того, даже в IIf оба значения вычисляются сразу, а только потом из них идет выбор.

Ответить

Номер ответа: 4
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #4 Добавлено: 01.10.07 17:17
Arcady_XQST, ты бы основы программирования почитал для начала... =)

Sharp, это ж получается, что для решения этой проблемы приходится писать вложенные Ифы? Но ведь это ж классический пример! Не ожидал я такого от Visual Basic...
VB это не C++, в нем логические выражения вычисляются полностью.

--> следовательно и Or и Xor туда же?

Ответить

Номер ответа: 5
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #5 Добавлено: 01.10.07 17:49
Arcady_XQST, ты бы основы программирования почитал для начала... =)
Я до C++ ещё не дошёл, поэтому незнаю про него почти ничего. Но в мои планы входит его изучение! :)

А
Sharp
правильно сказал, что на VB всё вычисляется! :)

Ответить

Номер ответа: 6
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #6 Добавлено: 01.10.07 19:38
И о чём думали создатели VB? Мож кто-нить скажет, зачем это проверяется???

Ответить

Номер ответа: 7
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #7
Добавлено: 01.10.07 20:41
стоять бояться, батька пришел :)

Во-первых IIF это не конструкция языка, а всего-лишь функция, так что совершенно логично и очевидно что значения параметров перед передачей их функции должны быть вычеслены.

Во-вторых, даже на Си/С++ такое условие вполне может слететь, из-за оптимизации компилятором.

Таким образом, подвожу итог. Условие абсолютно неработоспособно. И хватить гнать на vb6, лучше займитесь своим стилем письма =)

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: www.adsemenov.ru
 Профиль | | #10
Добавлено: 02.10.07 21:03
____ Не соглашусь.
____ Думаю, что и у одного и у другого стандарта есть одинаковое количество и плюсов и минусов. Лучше, когда есть выбор. По-моему, в PHP есть два вида логических операторов: одни из них "быстрые" и обрывают анализ за ненадобностью, а другие "медленные", но гарантирую вычисление всех частей выражения.
____ Я за выбор.

____ Не забывайте, кстати, что VB (до версии 6) — это изначально был только интерпретатор и выбор стандарта диктовался логикой "разборки" всего выражения. При этом, если поменять стадтарт, то некоторые программы на VB перестанут работать.

Ответить

Номер ответа: 11
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #11 Добавлено: 02.10.07 23:26
И о чём думали создатели VB? Мож кто-нить скажет, зачем это проверяется???
Добавь On Error Resume Next :)

Ответить

Номер ответа: 12
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 03.10.07 04:24
По-моему, в PHP есть два вида логических операторов: одни из них "быстрые" и обрывают анализ за ненадобностью, а другие "медленные", но гарантирую вычисление всех частей выражения.

Первый раз слышу.

Ответить

Номер ответа: 13
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #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-сайт: www.adsemenov.ru
 Профиль | | #15
Добавлено: 03.10.07 20:47
____ Java, кстати, наиболее "молодой" язык и в нём предусмотрели более широкие возможности стандарта разборки логических выражений.
____ Видимо было достаточное количество пожеланий на эту тему.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам