Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА? / 11 сообщений из 11, страница 1 из 1
05.03.2007, 14:56
    #34371593
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
IsNull(kod_cexa) выдаёт ИСТИНА
Код: plaintext
If IsNull(kod_cexa) Or Val(kod_cex) =  0  Then
...
Рейтинг: 0 / 0
05.03.2007, 15:29
    #34371720
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
А как он должен себя вести при операторе "или" ?
вот если стоит оператор "и", тогда при не выполнении первого условия, он во второе и не заглядывает.
Код: plaintext
1.
2.
3.
4.
kod_cexa = Null
If IsNull(kod_cexa) Or Val(kod_cex) =  0  Then MsgBox IsNull(kod_cexa) ' = true
kod_cexa =  0 
If IsNull(kod_cexa) Or Val(kod_cex) =  0  Then MsgBox IsNull(kod_cexa) ' = false
If IsNull(kod_cexa) And IsNull(kod_cexa) =  0  Then MsgBox IsNull(kod_cexa) ' = false
P.S. Null и 0 для IsNull - разные вещи
...
Рейтинг: 0 / 0
05.03.2007, 15:55
    #34371800
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
Дело не в or или and, а в том, что при kod_cex = Null эта строка выдаст ошибку.

Таки да, все функции должны быть посчитаны перед тем, как их значения могут быть обработаны If. If получает результат логической операции IsNull(kod_cexa) Or Val(kod_cex) = 0 и прозводит выполнение той или иной части кода, он ничего не высчитывает и не обязан знать, что за параметры передаются в какие функции.
...
Рейтинг: 0 / 0
05.03.2007, 15:58
    #34371813
FAndrew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
vkodorвот если стоит оператор "и", тогда при не выполнении первого условия, он во второе и не заглядывает.
Только не в VB. В if всегда вычисляются все выражения. За счет этого возможны разного рода ошибки. Например:
Код: plaintext
If intVAR<> 0  AND ( 10 /intVAR)= 2  then
Вывалиться с ошибкой деление на ноль, хотя вроде мы постарались её обойти.
Из этого же свойства рождается метод оптимизации.
Выражение
Код: plaintext
1.
2.
3.
4.
5.
If A> 5  then
    If A< 10  then
          операторы
    endif
endif
работает быстрее чем
Код: plaintext
1.
2.
3.
If A> 5  AND If A< 10  then
          операторы
    endif
endif
особено в цикле и если A часто бывает меньше пяти.
...
Рейтинг: 0 / 0
05.03.2007, 15:59
    #34371816
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
Был не прав насчет ошибки, в условии две разные переменные kod_cex и kod_cex a (или это очепятка?), но прав по поводу If.
vkodor тогда при не выполнении первого условия, он во второе и не заглядывает. Заглядывает, заглядывает...
...
Рейтинг: 0 / 0
05.03.2007, 16:03
    #34371830
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
Код: plaintext
If IsNull(kod_cexa) Or Val( "" & kod_cexa) =  0  Then
Приходиться приспосабливаться к языку.
...
Рейтинг: 0 / 0
05.03.2007, 16:53
    #34372020
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
Antonariy FAndrew
согласен заглядывает...
по мне лучше объявить переменную и не делать лишних проверок
Код: plaintext
1.
2.
3.
4.
Dim kod_cexa As Long
If  kod_cexa =  0  Then MsgBox intVAR

Dim kod_cexa As String
If Val(kod_cexa) =  0  Then MsgBox kod_cexa =  0 

видимо поэтому я не встречался с таким ...
А вообще забавно возьму на заметку.
...
Рейтинг: 0 / 0
05.03.2007, 21:02
    #34372627
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
И это не все !
Еще есть оператор IIF

Оператор IIF вычислит ОБА возвращаемых значения:
Вот это вызовет ошибку "Deivision by zero"
Код: plaintext
?IIf( 1  =  1 ,  10  /  2 ,  10  /  0 )
...
Рейтинг: 0 / 0
06.03.2007, 16:35
    #34375129
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
klen_
Код: plaintext
If IsNull(kod_cexa) Or Val( "" & kod_cexa) =  0  Then
Приходиться приспосабливаться к языку.

Лучше так:

Код: plaintext
1.
2.
If Nz(kod_cexa, 0 ) =  0  Then
    ...
End If

В VBA функция Nz есть.

В VB6 ее нет, но можно сделать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function Nz(Value, ValueIfNull) As Variant
    If IsNull(Value) Then
        Nz = ValueIfNull
    ElseIf IsEmpty(Value) Then
        Nz = ValueIfNull
    Else
        Nz = Value
    End If
End Function
...
Рейтинг: 0 / 0
06.03.2007, 20:19
    #34375846
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
Лучше использовать функции типа
Код: plaintext
1.
2.
3.
4.
5.
6.
Public Function StrFromVar(value) As String
    If Not IsNull(value) Then StrFromVar = value
End Function

Public Function IntFromVar(value) As Integer
    If Not IsNull(value) Then IntFromVar = value
End Function
Они более производительны при использовании в циклах. И лаконичней.
...
Рейтинг: 0 / 0
07.03.2007, 08:33
    #34376350
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА?
Большое спасибо.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Зачем Basic выполняет вторую часть оператора OR если первая уже ИСТИНА? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]