36
5.3. Преопределяне на типа (Type Cast)
този случай тя се интерпретира като включване на дясното множество в
лявото;
IN
включване на елемент в множество. иевият операнд е от дискретен (ordinal)
тип, а десният операнд е множество със същия (или поддиапазон на същия)
базов тип. Операцията дава резултат TRUE, ако левият операнд принадлежи
на множеството и FALSE в противен случай.
5.3. Преопределяне на типа (Type Cast)
Преопределянето на типа е разширение на стандарта на Pascal. В UniPascal
идентификаторът на всеки тип може да се използва като идентификатор на функция с
единствен параметър. Тази функция връща стойността на параметъра си, но той има
тип, чийто идентификатор е използван. Преопределянето е явно указание за промяна
на типа и се използва, за да може да се смени типа на променлива или цял израз (неявна
промяна на типа се извършва при преобразуването на целочислен в реален тип или
между различните целочислени типове).
ExpTypeCast =
TypeIdent '(' Expression ')'.
VarTypeCast =
TypeIdent '(' VariableRef ')'.
Преопределянето на тип е два вида:
*
преопределяне на типа на променлива. То се използва за да се смени типът
на променлива. Размерът на променливата и на типа, с които тя се
преопределя, трябва да съвпадат или променливата трябва да бъде
нетипизиран параметър. За този вид преопределяне на тип компилаторът
не генерира код, а на това място (и само на това) променливата се счита,
че е декларирана от типа, с който се преопределя;
*
преопределяне на типа на стойност. То се използва за явно указване за
преобразуване на типа. При този вид преопределяне е възможна генерация
на код за превръщане от единия вид към другия.
Синтаксисът за преопределяне на типа е един и същ и за двата случая.
Компилаторът решава кой от тях е в сила в зависимост от контекста.
Като пример ще разгледаме използването на побитови логически операции над
операнди от целочислени типове. Тъй като тези операции са дефинирани само над
типовете BYTE, WORD и LONGWORD, ще използваме необходимия ни тип за отделните
случай. Нека имаме определенията:
var i, i1, i2: integer;
b, b1, b2: shortcard;
l, l1, l2: LongInt;
Тогава следните оператори са валидни и правилни:
i:= word(i1) and word(i2);
b:= byte(b1) and byte(b2);
l:= longword(l1) and longword(l2);
Следният оператор е синтактично и семантично верен, но неправилен (т.е.
алгоритмично е неверен):
l:= word(l1) and word(l2);
Тъй като в случая е в сила преопределяне на типа на израз, то l1 и l2 първо ще
бъдат превърнати в WORD (чрез отрязване на старшата дума) и едва тогава ще бъде
приложена операцията AND над думи, т.е. горният оператор е еквивалентен на:
<<  <  GO  >  >>

Вернуться к началу сайта