Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

(Новий_тип) Операнд

або

Новий_тип (Операнд)

Ряд операцій може в залежності від типів своїх операндів виконувати неявне перетворення значення операнда з одного типу в інший (перетворення за умовчанням).

Розглянемо результати таких перетворень.

Дані типу char чи short int можуть використовуватися скрізь, де використовується тип int. В усіх випадках значення перетворюються до цілого типу.

Арифметичні операції над речовинними числами (float і double) за умовчанням виконуються з подвійною точністю.

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

Якщо ціле без знака (unsigned) використовується разом із знаковим цілим, то знакове ціле і результат перетворяться в ціле без знака.

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

Спочатку будь-які операнди типів char, unsigned char або short перетворюються в int, а будь-які операнди типу float перетворюються в double.

Потім, якщо який-небудь операнд має тип double, то інші операнди перетворюються до типу double і типом результату буде double.

У випадку, якщо який-небудь операнд має тип unsigned long, то інші операнди перетворюються до типу unsigned long і це ж буде і типом результату.

У випадку, якщо який-небудь операнд має тип long, то інші операнди перетворюються до типу long і це ж буде типом результату.

У випадку, якщо операнд має тип unsigned, то інші операнди перетворюються до типу unsigned, і це буде типом результату.

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

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

Покажчик на один тип може бути перетворений у покажчик на інший тип. При цьому можливо перетворення покажчика в покажчик на об'єкт меншого розміру і назад без змін.

Наприклад, функція виділення пам'яті може приймати розмір (у байтах) об'єкта, для якого треба виділити пам'ять, і повертати покажчик на тип void для перетворення у необхідний тип, що може в такий спосіб використовуватися.

Приклад

doube *dp; //Оголошення покажчика на тип doube

//void *malloc (size_t size); - бібліотечна функція С

//для виділення пам'яті розміром size_t size байт

dp = (doube *) malloc (sizeof (doube)); //Виділення пам'яті для

//покажчика на тип doube

*dp = 2.6 / 8.4;

Приклад

#include <stdio.h>

#include <conio.h>

#include <math.h>

main( )

{float r1, r2; int a, b, b1;

unsigned c, d;

char e, f;

unsigned char g;

float f1, f2;

clrscr( );

printf("Введення першого і другого речовинних чисел: ");

scanf("%f %f", &r1, &r2);

printf("Виведення результатів операцій для чисел: %5.2f %5.2f\n", r1, r2 );

printf("!r1 = %d ", !r1); printf("!r2= %d ", ! r2 );

printf("r1 > r2 %d ", r1 > r2); printf("r1<r2 %d\n", r1< r2);

printf("r1 || r2 %d ", r1|| r2); printf("r1&&r2 %d ", r1 && r2 );

printf("r1= = r2 %d ", r1 = = r2); printf("r1>=r2 %d\n", r1>= r2 );

printf("r1 <= r2 %d ", r1<= r2); printf("r1!=r2 %d\n", r1!= r2 );

//Вкладений блок, перемінні переоголошені: int r1, r2; float b;

{int r1, r2; float b;

printf("Введення першого і другого цілих чисел: ");

scanf("%d %d", &r1, &r2);

printf("Виведення результатів операцій для цілих чисел: %2d %2d\n", r1, r2 );

printf("!r1= %d ", ! r1); printf("!r2= %d ", !r2 );

printf("r1>r2 %d ", r1>r2); printf("r1<r2 %d\n" , r1< r2 );

printf("r1|| r2 %d ", r1 || r2); printf("r1&&r2 %d ", r1 && r2 );

printf("r1= = r2 %d ", r1= = r2); printf("r1>= r2 %d\n" , r1>= r2 );

printf("r1<= r2 %d ", r1<= r2); printf("r1!= r2 %d ", r1!= r2 );

printf("~ r1 %d ", ~ r1); printf("r1 | r2 %d\n" , r1 | r2 );

printf("r1^ r2 %d ", r1^ r2); printf("r1 & r2 %d ", r1 & r2 );

printf("r1<< r2 %d ", r1<< r2); printf("r1>> r2 %d\n" , r1>> r2 );

printf("Вихідні значення: r1= %d r2= %d\n", r1, r2 );

r2 = r1++; //Постфікснї операції: а1++ а1- -

printf("r2 = r1++; r1= %d r2= %d\n", r1, r2 );

- - r1; r2 = ++r1; //Префіксні операції: ++а1 - - а1

printf("-іr1; r2=++r1; r1= %d r2= %d\n", r1, r2 );

r1- =4; r2 += 5; //Складене присвоювання

printf("r1-=4; r2+= 5; r1= %d r2= %d\n", r1, r2 );

a = r2- =2, r1+= 5; //Складене присвоювання

printf("a= r2 - = 2, r1+= 5; r1= %d r2= %d a= %d\n", r1, r2, a );

a = (r1< r2) ? r1: r2; //Тернарна операція: якщо r1< r2, то а = r1 інакше а = r2

printf("a= (r1< r2) ? r1: r2; a= %d\n", a );

a = r 2% r1; //Залишок від розподілу цілих

printf("а= r1 % r2; "); printf("а = %d\n", r2 % r1 );

a = r2 / r1; //Розподіл цілих

printf("a= r2 / r1; a=%d\n", a );

b = (float) r2 / (float) r1; //Розподіл c перетворенням типів

printf("b= (float) r2 / (float) r1; b= %f\n", b );

}

float q = 1.3, q1= 2.4, raz;

printf("Введіть перемінні: a - (int), c - (unsigned), \

g - (unsigned char)\n");

scanf("%i, %u, %uc", &a, &c, &g );

b = (a & (c<< 3));

b1 = (a & 3) << 7;

f = (a & 3) << 7;

f1 = q / (c | 0x3E);

f2 = a / (c | 0x3E);

raz = exp (q + q1) / 4;

printf("g=%u, q=%5.2f, q1=%7.2f, b=%i, b1=%i, \

\n", g, q, q1, b, b1);

printf("f= %i, f1= %6.3f, f2= %6.3f, raz=%f\n", f, f1, f2, raz );

getch( ); return 0;

}

/* Введення першого і другого речовинних чисел: 56 7

Виведення результатів операцій для чисел: 56.00 7.00

!r1= 0 !r2 = 0 r1> r2 1 r1< r2 0

r1|| r2 1 r1 && r2 1 r1==r2 0 r1>= r2 1

r1<= r2 0 r1 != r2 1

Введення першого і другого цілих чисел: 45 2

Виведення результатів операцій для цілих чисел: 45 2

!r1= 0 !r2= 0 r1> r2 1 r1< r2 0

r1|| r2 1 r1 && r2 1 r1= = r2 0 r1>= r2 1

r1<= r2 0 r1!= r2 1 ~r1 -46 r1 | r2 47

r1^ r2 47 r1 & r2 0 r1<< r2 180 r1>> r2 11

Вихідні значення: r1 = 45 r2 = 2

r2 = r1++; r1= 46 r2= 45

- - r1; r2=++r1; r1= 46 r2= 46

r1 - = 4; r2+= 5; r1= 42 r2= 51

a= r2 - =2, r1+= 5; r1= 47 r2= 49 a=49

a= (r1< r2) ? r1: r2; a= 47

а= r1 % r2; а= 2

a= r2 / r1; a= 1

b= (float) r2 / (float) r1; b= 1.042553

Введіть перемінні a-(int), c-(unsigned), g-(unsigned char)

-34 6 7

g = 122, q = 1.30, q1= 2.40, b= 512, b1= 256,

f = 0, f1 = 0.010, f2 = 519.000, raz = 10.111827 */