a shr n представляет собой целое положительное, полученное из двоичного представления числа a сдвигом вправо на n позиций.
Например:
3 shl 2 = 12
12 shr 2 = 3
поскольку 3=11 2, после сдвига влево на 2 позиции 11 2преобразуется в 1100 2=12, а 12=1100 2после сдвига вправо на 2 позиции преобразуется в 11 2=3.
Операции сравнения <, >, <=, >=, =, <> возвращают значение типа boolean и применяются к операндам простого типа и к строкам.
Операции = и <> также применяются ко всем типам. Для размерных типов по умолчанию сравниваются значения, для ссылочных типов - ссылки. Можно переопределить это поведение, перегрузив операции = и <>. Аналогично можно перегрузить все операции сравнения для типов записей и классов, вводимых пользователем.
К строкам применимы все операции сравнения <, >, <=, >=, =, <>. Сравнение строк на неравенство осуществляется лексикографически: s1 < s2 если для первого несовпадающего символа с номером i s1[i]
Кроме этого, к строкам и символам применима операция конкатенации (слияния) +, ее результат имеет строковый тип.
Например, 'a'+'b'='ab'.
К строкам также применима операция +=:
s += s1; // s := s + s1;
Строка может складываться с числом, при этом число предварительно преобразуется к строковому представлению:
s := 'Ширина: '+15; // s = 'Ширина: 15'
s := 20.5+''; // s = '20.5'
s += 1; // s = '20.51'
Над строками и целыми определена операция *: s*n и n*s означает строку, образованную из строки s, повторенной n раз:
s := '*'*10; // s = '**********'
s := 5*'ab' // s = 'ababababab'
s := 'd'; s *= 3; // s = 'ddd'
Ко всем указателям применимы операции сравнения = и <>.
К типизированным указателям применима операция разыменования ^: если p является указателем на тип T, то p^ - элемент типа T, на который указывает p. Указатели pointer разыменовывать нельзя.
К множествам с базовыми элементами одного типа применимы операции + (объединение), - (разность) и * (пересечение), а также операторы +=, -= и *=:
vars1,s2,s: set ofbyte;
begin
s1 := [1..4];
s2 := [2..5];
s := s1 + s2; // s = [1..5]
s := s1 - s2; // s = [1]
s := s1 * s2; // s = [2..4]
// s += s1 эквивалентно s := s + s1
// s -= s1 эквивалентно s := s - s1
// s *= s1 эквивалентно s := s * s1
s += [3..6]; // s = [2..6]
s -= [3]; // s = [2,4..6]
s *= [1..5]; // s = [2,4..5]
end.
К множествам с базовыми элементами одного типа применимы также операции сравнения = (равенство), <> (неравенство), <= (нестрого вложено), < (строго вложено), >= (нестрого содержит) и > (строго содержит):
[1..3] = [1,2,3]
['a'..'z'] <> ['0'..'9']
[2..4] < [1..5]
[1..5] <= [1..5]
[1..5] > [2..4]
[1..5] >= [1..5]
Но неверно, что [1..5] < [1..5].
Наконец, операция inопределяет, принадлежит ли элемент множеству: 3 in[2..5] вернет True, 1 in[2..5] вернет False.
Операция @ применяется к переменной и возвращает ее адрес. Тип результата представляет собой типизированный указатель на тип переменной. Например:
var
r: real;
pr: ^real := @r;
Операция isпредназначена для проверки того, имеет ли классовая переменная указанный динамический тип. Операция asпозволяет безопасно преобразовать переменную одного классового типа к другому классовому типу (в отличие от явного приведения классового типа).
Операция isимеет вид:
a is ClassType
и возвращает True если a принадлежит к классу ClassType или одному из его потомков.
Например, если Base и Derived - классы, причем, Derived - потомок Base, переменные b и d имеют соответственно типы Base и Derived, то выражения b isBase и d isBase возвращают True, а b isDerived - False.
Операция asимеет вид:
a as ClassType
и возвращает ссылку на объект типа ClassType если преобразование возможно, в противном случае возвращает nil.
Например, в программе
type
Base = class
end;
Derived = class(Base)
procedurep;
begin
end;
end;
varb: Base;
begin
b := new Base;
writeln(b isDerived);
b := new Derived;
writeln(b isDerived);
end.
первый раз выводится False, второй - True.
Операции isи asиспользуются для работы с переменной базового класса, содержащей объект производного класса.
1 способ.
ifb isDerived then
Derived(b).p;
2 способ.
Читать дальше