![]() КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Преобразование и совместимость типовВ этом разделе речь будет идти о тех ситуациях, когда при выполнении операции или инструкции участвуют данные разных типов. Например, что произойдет, если переменной целого типа присваивается числовое значение типа Single? В отношении типов VB проявляет максимально возможную терпимость. Когда это возможно, преобразование одного типа в другой будет выполнено автоматически и программисту нет нужды об этом заботиться. Следует при этом иметь в виду:
Например, не возникнет ошибки периода выполнения при присвоении свойству Caption некоторой надписи, которое имеет тип String, значения 125 переменной типа Integer. Произойдет преобразование целого числового значения 125 в строку символов “125”. И наоборот. При присвоении переменной целого типа значения свойства Text некоторого текстового поля, которое имеет тип String (пусть, например, в этом текстовом поле набрано три символа 125) произойдет преобразование строки символов “125” в целое число и целочисленная переменная получит значение 125.
Sub A 1: Dim i As Integer 2: i = Label1.Caption 3: Label1.Caption = 250 End Sub
В теле этой процедуры в строке 2 происходит преобразование значения свойства Caption из типа String к типу Integer. В строке 3 происходит преобразование значения целой константы 250 к типу String, который имеет свойство Caption. Возможно также выполнение арифметической операции, например умножения (*), когда один или оба операнды являются строкой символов, но при условии, что их значения, можно интерпретировать как числа.
Sub B Dim i As Integer, str As String, _ r As Integer i = 5 str = “25” r = i * str ‘Результат: 125. String -> Integer End Sub
При этом особую осторожность следует соблюдать с операцией сложения (+), которая в зависимости от контекста может означать либо операцию сложения, либо операцию сцепления. В операции операнд1 + операнд2 символ (+) VB будет воспринимать как: операцию сложения, если оба операнда имеют кокой либо из числовых типов; операцию сложения, если один операнд имеет числовой тип, а второй является строкой символов, значение которой может быть интерпретировано как число; операцию сцепления, если один операнд имеет числовой тип, а второй является строкой символов, значение которой не может быть интерпретировано как число; операцию сцепления, если оба операнда имеют строковый тип независимо от их значений.
Пример.
Dim i As Integer Dim r As Single Dim st1 As String, st2 As String Private Sub Command1_Click () i = 2 r = -1.3 st1 = r + i ‘Результат: “0.7” ‘Integer-> Single, Single -> String End Sub
Остановимся подробнее на существенных, но на первый взгляд не заметных, особенностях выполнения инструкций процедуры Command1_Click. При выполнении этих трех инструкций два раза осуществляется преобразование типа. В инструкции St1 = r + i при выполнении арифметической операции сложения тип Integer операнда i преобразуется к типу Single операнда r, так как арифметическая операция может быть выполнена над однотипными операндами. Наконец, результат сложения типа Single преобразуется к типу String переменной St1.
Пример. Рассмотрим продолжение программного кода предыдущего примера.
Private Sub Command2_Click() st1 = 25 ‘Результат: “25” st2 = 15 ‘Результат: “15” st2= st1 + st2 ‘Результат: “2515” End Sub
Произошло сцепление операндов. Это следовало ожидать, поскольку оба операнда имеют строковый тип. Посмотрим, что произойдет, если один операнд будет иметь строковый, а другой – числовой, например, целый тип. Продолжим программный код, приведенный в двух предыдущих примерах. Введем следующий программный код:
Private Sub Command2_Click() st1 = 2 st2 = 3 st1 = 25 + st1 + st2 ‘Результат: “30” ‘String -> Integer, String -> Integer ‘Integer -> String End Sub
При выполнении вычисления значения выражения 25 + st1 + st2 первой выполняется операция 25 + st1. В этой операции один операнд (константа 25) имеет числовой тип, а другой (строка st1) имеет значение, которое может быть интерпретировано как число. Поэтому здесь символ (+) воспринят как операция сложения. Результат операции сложения (27) тоже имеет числовой тип, поэтому символ (+) в следующей операции 27+3 также воспринят как операция сложения и, в конце концов, получен понятный результат 30. Изменим порядок следования операндов в инструкции присвоения st1 = 25 + st1 + st2, применив вместо нее инструкцию st1 = st1 + st2 + 25. Переменная st1 на первый взгляд получит неожиданный результат вычислений “48”. Изменение порядка слагаемых привело к изменению значения результатов вычислений! Почему? Дело в том, что первой теперь выполняется операция st1 + st2, в которой символ (+) воспринимается как операция сцепления, поскольку оба операнда имеют строковый тип. Результат операции соответственно тоже имеет строковый тип и равен “23”. При выполнении следующей операции “23” + 25 символ (+) будет воспринят, как операция сложения, поскольку один операнд (константа 25) имеет числовой тип, а другой операнд (“23”) может быть интерпретирован как число. Итак, в VB в отличие от математики сумма может зависеть от порядка слагаемых.
|