Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы по Основам программирования. Список литературы. 1 курс.docx
Скачиваний:
47
Добавлен:
19.02.2016
Размер:
139.53 Кб
Скачать

Контрольні запитання

  1. Що таке вираз?

  2. Наведіть класифікацію виразів.

  3. Що таке R- та L - вирази?

  1. Наведіть правила застосування R - та L- виразів.

  2. Наведіть прагматичні правила написання виразів.

  3. Що спільного між літералом, змінною та виразом?

  4. Що означає обчислити вираз?

Лабораторна робота 1.8

ДОСЛІДЖЕННЯ ПРИВЕДЕННЯ ТИПIВ

Мета лабораторної роботи - вивчення суворої типізації, правил приведення типів та механізму обходу суворої типізації.

Теоретичні відомості

В алгоритмічних мовах всі операції в виразах виконуються з операндами визначених типів. Часто трапляється так, що є необхідним конструювати вирази з програмних об’єктів різних типів даних, або вирази, що розташовані праворуч та ліворуч оператору привласнення, генерують значення різних типів. В таких випадках застосовуються механізми приведення значень одного типу до значень іншого типу. В мовах програмування існує явне та неявне приведення типів.

Засоби явного приведення (перетворення) значень типів

Явне приведення типів виконується за допомогою спеціального оператора:

<приведення>:: =<індикатор типу> (<вираз>)|(<індикатор типу>) <вираз>

Наприклад:

iCount = int (fG/3.14);

fCoeff1 = (float)dCoeff2;

Засоби неявного приведення (перетворення) значень типів

Мова С не суворо типізована і тому має складну систему неявного приведення типів:

- знакове коротке до довгого – розширення знаковим бітом уліво

- беззнакове коротке до довгого – розширення уліво нульовим бітом

- знакове довге до короткого – відсікання вправо з установленням знакового біту (для знакових)

- беззнакове довге до короткого - відсікання вправо. лівий біт набуває знакової функції (для знакових)

- знакове до беззнакового – лівий біт втрачає знакову функцію

- беззнакове до знакового – лівий біт набуває знакової функції

- ціле до дійсного – перетворюється у довге, а далі у дійсне

- дійсне у ціле – перетворюється у довге

- дійсне у дійсне з подвійною точністю – доповнення мантиси нульовими битами праворуч

- дійсне з подвійною точністю у дійсне – відсікання молодших бітів мантиси

Неявне приведення типів є небажаною ситуацією, тому що результат такого приведення може бути не передбачуваним, і його використання може призвести до важких помилок у програмі. Кращим шляхом є застосування явного приведення типів.

Обхід суворої типізації

В окремих випадках, коли неможливе застосування явного чи неявного приведення типів, для перетворення значень використовуються механізми обходу суворої типізації. Один з таких механізмів передбачає використання нетипізованих вказівних змінних, оголошених як pointer (Паскаль), void* (Сі).

Механізм базується на можливості нетипизованих покажчиків посилатися на ім’я змінної будь-якого типу (дія 1). Потім вміст нетипізованого покажчика може бути присвоєним типізованому покажчику (дія 2). Типізований покажчик дозволяє застосовувати операцію розименування для доступу до комірок пам’яті, на які вказує покажчик. Вміст комірок буде інтерпретованим як такий, що має тип, котрим типізований покажчик.

v = &R;

Або

v = U1;

U2 = (type U2) v;

U1, U2 – типізовані вказівні змінні; R - проста змінна; type U2 - явне приведення типу.

Приклад програм, які демонструють механізм обходу суворої типізації:

{ Паскаль } // Сі

Program ost; void main()

Var {

fA : real; float fA;

nB : integer; int nB;

pnB : ^integer; int *pnB;

pP: pointer; void *pP;

Begin

{ fA => nB } \\ fA => nB

fA := 267.7; fA = 267.7;

pP := @fA; pP = &fA;

pnB := pP; pnB = (int*)pP;

nB := pnB^; nB = *pnB;

End. }