FAQ по Visual Basic

Содержание / Начальные сведения о VB Поиск | Далее

§ 3.4. Эти нехорошие операторы

Зачастую бывает так, что программа глючит непонятно из-за чего. Обычно причину удается найти, но на это тратится немало времени и нервов. Так вот, я считаю своим долгом предостеречь вас от некоторых трудноуловимых глюков, связанных с операторами VB.

  1. Операторы And, Or, Xor.
  2. Как известно, в C++ логические (булевы) и битовые операторы имеют различную форму, например, побитное «И» записывается как “&”, а логическое «И» — “&&”. А в VB они имеют одинаковую форму, и выбор их типа определяется типом операндов. Поэтому бывает нелишним явно приводить их тип: для побитных операций — к типу Long (необязательно именно к нему, можно к любому целочисленному), для логических — к типу Boolean.

  3. Оператор Not.
  4. Этот оператор тоже имеет отношение к битовым операциям. Дело в том, что, к сожалению, он не приводит аргумент к типу Boolean, а работает как оператор дополнения “~”. Поэтому код в примере ниже, расположенный после Else, выполнен никогда не будет:

    Dim hFile As Long, lRead As Long
    Dim bData(0 To 255) As Byte
    . . .
    If Not ReadFile(hFile, bData(LBound(bData)), _
        UBound(bData) - LBound(bData) + 1, _
        lRead, ByVal 0&) _
    Then
        Exit Sub
    Else
        . . .
    End If
    

    Поясню, почему это так. ReadFile возвращает одно из двух значений: TRUE, то есть 1, и FALSE, то есть 0. Дополнение (которое, кстати, можно вычислить и таким образом: a Xor −1&) к единице равно −2, а к нулю — −1. Оператор же If выполняет ветку Else только тогда, когда его аргумент равен False, то есть нулю.

    Особенно эта ошибка трудноуловима, когда описывается API-функция и тип возвращаемого значения ей задается Boolean, хотя на самом деле это не так, и она возвращает не минус единицу, а единицу. Будьте внимательны!

  5. Операторы деления.
  6. Тоже интересный глюк. Вот результат вычисления выражений, введенных в Immediate Window:

    ? 256 / 16 * 16
     256
    ? 256 \ 16 * 16
     1
    

    То есть у целочисленного деления приоритет меньше, чем у умножения и обычного деления.

Автор:
Master

Предыдущий раздел Следующий раздел

© 2004. При цитировании, пожалуйста, не забудьте поставить ссылку на оригинальную страницу.