Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Отображение на типы . Net. Тип pascalabc. Net. Тип. Net. Record. Арифметические операции. Shortint. Smallint. Integer. Longword. Single. Shortint. Smallint. Integer. Longword. Single. Логические операции. Побитовые операции. Операции сравнения. Строковые

Поиск

Отображение на типы .NET

Стандартные типы PascalABC.NET реализуются типами библиотеки классов .NET. Далее приводится таблица соответствий стандартных типов PascalABC.NET и типов .NET.

 

Тип PascalABC.NET

Тип .NET

int64

System.Int64

uint64

System.UInt64

integer, longint

System.Int32

longword, cardinal

System.UInt32

smallint

System.Int16

word

System.UInt16

shortint

System.SByte

byte

System.Byte

boolean

System.Boolean

real

System.Double

double

System.Double

char

System.Char

string

System.String

object

System.Object

array of T

T[]

record

struct

Арифметические операции

К арифметическим относятся бинарные операции +, -, *, /, +=, -=, *=, /= для вещественных и целых чисел, бинарные операции div и mod для целых чисел и унарные операции + и - для вещественных и целых чисел. Тип выражения x op y, где op - знак бинарной операции +, - или *, определяется из следующей таблицы:

 

 

shortint

byte

smallint

word

integer

longword

int64

uint64

single

real

shortint

integer

integer

integer

integer

integer

int64

int64

uint64

single

real

byte

integer

integer

integer

integer

integer

longword

int64

uint64

single

real

smallint

integer

integer

integer

integer

integer

int64

int64

uint64

single

real

word

integer

integer

integer

integer

integer

longword

int64

uint64

single

real

integer

integer

integer

integer

integer

integer

int64

int64

uint64

single

real

longword

int64

longword

int64

longword

int64

longword

uint64

uint64

single

real

int64

int64

int64

int64

int64

int64

uint64

int64

uint64

single

real

uint64

uint64

uint64

uint64

uint64

uint64

uint64

uint64

uint64

single

real

single

single

single

single

single

single

single

single

single

single

real

real

real

real

real

real

real

real

real

real

real

real

То есть, если операнды - целые, то результатом является самый короткий целый тип, требуемый для представления всех получаемых значений.

При выполнении бинарной операции с uint64 и знаковым целым результирующим типом будет uint64, при этом может произойти переполнение, не вызывающее исключения.

Для операции / данная таблица исправляется следующим образом: результат деления любого целого на целое имеет тип real.

Для операций div и mod выполняются эти же правила, но операнды могут быть только целыми. Правила вычисления операций div и mod - следующие:

x div y - результат целочисленного деления x на y. Точнее, x div y = x / y, округленное до ближайшего целого по направлению к 0;
x mod y - остаток от целочисленного деления x на y. Точнее, x mod y = x - (x div y) * y.

Унарная арифметическая операция + для любого целого типа возвращает этот тип. Унарная арифметическая операция - возвращает для целых типов, меньших или равных integer, значение типа integer, для longword и int64 - значение типа int64, к uint64 унарная операция - не применима, для типов single и real - соответственно типы single и real. То есть так же результатом является самый короткий тип, требуемый для представления всех получаемых значений.

Бинарные операции +=, -=, *=, /= не возвращают результат. Они используются в операторах присваивания и имеют следующий смысл: a #= b означает a := a # b, где # - знак операции +, -, *, /.

Например:

a += 3; // увеличить a на 3
b *= 2; // увеличить b в 2 раза

Операция /= неприменима, если левый операнд - целый.

Операции +=, -=, *=, /= могут также использоваться со свойствами классов соответствующих типов в левой части.

Логические операции

К логическим относятся бинарные операции and, or и xor, а также унарная операция not, имеющие операнды типа boolean и возвращающие значение типа boolean. эти операции подчиняются стандартным правилам логики: a and b истинно только тогда, когда истинны a и b, a or b истинно только тогда, когда истинно либо a, либо b, a xor b истинно только тогда, когда только одно из a и b истинно, not a истинно только тогда, когда a ложно.

Выражения с and и or вычисляются по короткой схеме:

в выражении x and y если x ложно, то все выражение ложно, и y не вычисляется;
в выражении x or y если x истинно, то все выражение истинно, и y не вычисляется.

Побитовые операции

К побитовым относятся бинарные операции and, or, not, xor, shl, shr. Они производят побитовые манипуляции с операндами целого типа. Результирующий тип для and, or, xor будет наименьшим целым, включающим все возможные значения обоих типов операндов. Для shl, shr результирующий тип совпадает с типом левого операнда, для not - с типом операнда.

Побитовые операции осуществляются следующим образом: с каждым битом (0 принимается за False, 1 - за True) производится соответствующая логическая операция. Например:

00010101 and 00011001 = 00010001
00010101 or 00011001 = 00011101
00010101 xor 00011001 = 00001100
not 00010101 = 11101010

(операнды и результат представлены в двоичной форме).

Операции сравнения

Операции сравнения <, >, <=, >=, =, <> возвращают значение типа boolean и применяются к операндам простого типа.

Операции = и <> также применяются ко всем типам (!). Для размерных типов по умолчанию сравниваются значения, для ссылочных типов - адреса. Можно переопределить это поведение, перегрузив операции = и <>. Аналогично можно перегрузить все операции сравнения для типов записей и классов, вводимых пользователем.

Строковые операции

К строкам применимы все операции сравнения <, >, <=, >=, =, <>. Кроме этого, к строкам и символам применима операция конкатенации (слияния) +, ее результат имеет строковый тип.

Например, 'a'+'b'='ab'.

К строкам также применима операция +=:

s += s1;        означает         s := s + s1;

Операции с указателями

Ко всем указателям применимы операции сравнения = и <>.

К типизированным указателям применима операция разыменования ^: если p является указателем на тип T, то p^ - элемент типа T, на который указывает p. Указатели pointer разыменовывать нельзя.

Операции с множествами

К множествам с базовыми элементами одного типа применимы операции + (объединение), - (разность) и * (пересечение), а также +=, -= и *=:

var s1,s2,s: set of byte;
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 += [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] - верно, 1 in [2..5] неверно.

Операция @

Операция @ применяется к переменной и возвращает ее адрес. Тип результата представляет собой типизированный указатель на тип переменной. Например:

var
r: real;
pr: ^real := @r;

Операции is и as

Операция is предназначена для проверки того, имеет ли классовая переменная указанный динамический тип. Операция as позволяет безопасно преобразовать переменную одного классового типа к другому классовому типу (в отличие от явного приведения классового типа).

Операция is имеет вид:

a is ClassType

и возвращает True если a принадлежит к классу ClassType или одному из его потомков.

Например, если Base и Derived - классы, причем, Derived - потомок Base, переменные b и d имеют соответственно типы Base и Derived, то выражения b is Base и d is Base возвращают True, а b is Derived - False.

Операция as имеет вид:

a as ClassType

и возвращает ссылку на объект типа ClassType если преобразование возможно, в противном случае возвращает nil.

Например, в программе

type
Base = class
end
;
Derived = class(Base)
procedure
p;
begin
end
;
end
;

var b: Base;

begin
b := new Base;
writeln(b is Derived);
b := new Derived;
writeln(b is Derived);
end.

первый раз выводится False, второй - True.

Операции is и as используются для работы с переменной базового класса, содержащей объект производного класса.

1 способ.

if b is Derived then
Derived(b).p;

2 способ.

var d: Derived := b as Derived;
d.p;

Операция new

Операция new имеет вид:

new ИмяКласса(ПараметрыКонструктора)

Она вызывает конструктор класса ИмяКласса и возвращает созданный объект.

Например:

type
My = class
constructor Create(i: integer);
begin
end;
end;

var m: My := new My(5);

Эквивалентным способом создания объекта является вызов конструктора в стиле Object Pacal:

var m: My := My.Create(5);

Создание объекта класса при инициализации переменной проще проводить, используя автоопределение типа:

var m := new My(5);

Операции typeof и sizeof

Операция sizeof(имя типа) возвращает для этого типа его размер в байтах.

Операция typeof(имя типа) возвращает для этого типа объект класса System.Type. Приведем пример использования typeof:

type
Base = class ... end;
Derived = class(Base) ... end;

var b: Base := new Derived;

begin
writeln(b.GetType = typeof(Derived));
end.

Приоритет операций

Приоритет определяет порядок выполнения операций в выражении. Первыми выполняются операции, имеющие высший приоритет. Операции, имеющие одинаковый приоритет, выполняются слева направо.

@, not, ^, +, - (унарные), new

1 (наивысший)

*, /, div, mod, and, shl, shr, as

+, - (бинарные), or, xor

=, <>, <, >, <=, >=, in, is, +=, -=, *=, /=

4 (низший)

Для изменения порядка выполнения операций в выражениях используются скобки.



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 2; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.174.204 (0.007 с.)