Операція визначення розміру sizeof 


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



ЗНАЕТЕ ЛИ ВЫ?

Операція визначення розміру sizeof



Унарна операція sizeof повертає обсяг пам'яті, який займає або потребує її операнд. Обсяг пам'яті визначається в байтах. Формат запису операції:

 

sizeof (тип)

sizeof ім’я_змінної

 

В якості прикладу використання операції визначення розміру знайдемо типи основних типів даних мови програмування С++ для компілятора Microsoft Visual Studio 2010.

 

#include <iostream>

using namespace std;

int main(){

cout << "sizeof (float)\t"       

     << sizeof (float) << endl;          // 4

cout << "sizeof (double)\t"      

     << sizeof (double) << endl;         // 8

cout << "sizeof (long double)\t"  

     << sizeof (long double) << endl;    // 8

cout << "sizeof (char)\t"   

     << sizeof (char) << endl;           // 1

cout << "sizeof (short int)\t"   

     << sizeof (short int) << endl; // 2

cout << "sizeof (int)\t"    

     << sizeof (int) << endl;       // 4

cout << "sizeof (long int)\t"   

     << sizeof (long int) << endl;  // 4

cout << "sizeof (long long int)\t"

     << sizeof (long long int) << endl; // 8

}

 

Визначимо обсяг пам'яті, необхідний для збереження результатів обчисленні різних виразів. В першому випадку тип результату int, в другому – double.

 

#include <iostream>

using namespace std;

int main(){

cout << sizeof (1 + 1) << endl; // 4 - int

cout << sizeof (1. + 1.) << endl; // 8 - double

}

 

Узгодження типів у виразах

Існують дві схеми узгодження типів операндів у виразах: арифметичні перетворення типів і перетворення типів в операціях присвоєння.

Арифметичні перетворення типів застосовуються при узгодженні типів операндів в арифметичних і порозрядних операціях, а також в операціях порівняння. Вони базуються на «підтягуванні» операнда молодшого типу до старшого (цей процес ще називають просування типів – type promotion). Встановлено таку ієрархію типів:

 

char < short ≤ int ≤ long < float < double < long double

 

Для цілих типів додатково діє умова

 

signed тип < unsigned тип

 

Підтягування типів виконується за такою схемою:

1) всі операнди з типами char і short розширяються до типу int;

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

3) якщо старший операнд є цілим, а молодший – без знакове число, то молодший операнд доповнюється до розміру старшого нульовими бітами;

4) перетворення signed тип у unsigned тип не змінює двійкового коду числа;

5) якщо старший операнд є дійсним, а молодший – цілим, то виконується перетворення цілого типу в дійсний;

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

В операціях присвоєння діє правило перетворення типу виразу, записаного справа від знака =, до типу змінної чи l-операнда, яким присвоюється значення даного виразу. При цьому:

1) якщо тип змінної (l-операнда) зліва від знаку = старший за тип виразу справа від знаку =, то тип виразу підтягується до типу змінної за схемою, описаною вище;

2) якщо тип змінної (l-операнда) зліва від знаку = молодший за тип виразу справа від знаку =, то значення змінної перетворюється (обрізається) до типу змінної.

Пониження типів пов’язане з такими перетвореннями:

1) перетворення числового значення старшого дійсного типу до молодшого дійсного типу за умови, що воно потрапляє в діапазон значень молодшого типу, реалізується зменшення (через округлення) точності мантиси; інакше результат перетворення не визначений;

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

3) перетворення unsigned тип у signed тип не змінює розмір та двійковий код числа, старший біт стає знаковим розрядом нового знакового числа; якщо він дорівнює одиниці – число вважається від’ємним;

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

Умовні оператори

Оператори

Оператори – основні конструктивні компоненти програми, призначені для виконання встановлених дій. Через оператори реалізують послідовність кроків алгоритму розв’язання задачі. Мова С++ має невеликий, але потужній за своїми функціональними можливостями набір операторів.

За конструкцією всі оператори можна поділити на дві групи: прості оператори, до складу яких не входять інші оператори; складені оператори, обов’язковим компонентом яких є вкладені (внутрішні) оператори.

За характером дій, що виконуються оператором, виділяють такі групи: оператори-вирази, умовні оператори (if, switch), оператори циклу (for, while, do while), оператори переходу (go, break, continue, return).

Окремим видом складеного оператора є блок. Блоком у мові С++ називають групу довільних операторів, об’єднаних фігурними дужками. Після правої дужки крапка з комою не ставиться. Блок розглядається як один оператор, він може бути записаний всюди, де синтаксис мови вимагає наявності оператора. Всередині блоку можна оголошувати внутрішні змінні, які не можна використовувати за межами блоку (див. розділ 3.2).

Оператором вважається кожен допустимий вираз, що закінчується знаком крапка с комою. Такі вирази можна розглядати як оператори – вирази. Наприклад:

 

#include <iostream>

using namespace std;

void print(int x) {

cout << x << endl;

}

int main(){

int a = 1, b = 2, t;

a + b * t;           // 1й оператор-вираз

123;                 // 2й оператор-вираз

t = a + b;           // 3й оператор-вираз

++a;                 // 4й оператор-вираз

a > b? a++: b++;   // 5й оператор-вираз

print(a);            // 6й оператор-вираз

pow(a, 2.);          // 7й оператор-вираз

}

 

При компіляції цієї програми помилок не буде, тільки для першого оператора – виразу буде видано таке попередження: warning C4552: '+': operator has no effect; expected operator with side-effect, тобто оператор не виконує ніяких дій, значення виразу буде обчислене, але воно не використовується і буде втрачене після завершення оператора. Так саме і другий оператор вираз є беззмістовним, тобто він не виконує ніяких дій, але синтаксично правильним.

Інші оператори – вирази цього прикладу виконують такі дії: третій – присвоює змінній t значення виразу, четвертий і п’ятий – збільшують значення змінних на одиницю, шостий і сьомий – викликають функції.

Таким чином, оператори – вирази можна поділити на дві групи: оператори присвоєння і оператори звертання до функції.

Синтаксично оператори присвоєння є виразами, в яких останньою виконується операція присвоєння, а в кінці записано знак;. Можна використовувати кожну з форм операції присвоєння: звичайне присвоєння, комбіноване присвоєння, інкремент – декремент.

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

Як окремий оператор може виступати і звертання до функції, яка повертає значення. В цьому випадку виконуються дії, що передбачені в функції, а значення, яке вона повертає, не використовується і втрачається.

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

Умовний оператор if

Умовні оператори реалізують розгалуження процесу виконання програми та дають змогу вибрати один з можливих варіантів продовження програми. В С++ є два два вида умовних операторів – іf i switch.

Оператор іf має дві форми – скорочену та повну. Синтаксис скороченої форми умовного оператора такий:

 

if (вираз) оператор;

 

Вираз, записаний в дужках, визначає, чи буде виконаний оператор. Якщо значення виразу істина (ненульове), то оператор буде виконаний. Якщо значення виразу хибне (нульове), то оператор буде пропущений, управління передається до оператора, наступного за іf.

Оператором іf може бути довільний оператор мови С++: оператор – вираз, умовний оператор, оператор циклу, оператор переходу. Якщо від значення виразу в операторі іf має залежити група операторів, то їх оформляють як оператор – блок.

Синтаксис повної форми оператора іf такий:

 

if (вираз)

оператор1;

else

оператор2;

 

Оператор 1 виконується, якщо значення виразу істинне (ненульове), а оператор 2 – якщо хибне (нульове). Внутрішні оператори 1 і 2 можуть бути довільними операторами мови, в тому числі порожніми операторами, блоками, що об’єднують групу операторів, або іншим оператором іf. В останньому випадку за замовчуванням else – частина умовного оператора пов’язується з найближчим попереднім оператором іf.

Приклад програми. Знайти модуль числа.

 

#include <iostream>

using namespace std;

int main(){

setlocale(LC_ALL, "");

double a = -7, t;

if (a >= 0)

     t = a;

if (a < 0)

     t = -a;

if (a >= 0)

     t = a;

else

     t = -a;

t = a > 0? a: -a;

}

 

Приклад програми. Знайти рішення рівняння виду .

 

#include <iostream>

using namespace std;

int main(){

setlocale(LC_ALL, "");

double a=1, b=4, c=3;

double d, x1, x2;

d = b * b - 4 * a * c;

if (d > 0) {

     x1 = (-b + sqrt(d)) / (2 * a);

     x2 = (-b - sqrt(d)) / (2 * a);

     cout << "2 решения" << endl;

     cout << "x1 = " << x1 << endl;

     cout << "x2 = " << x2 << endl;

} else if (d == 0) {

     x1 = (-b + sqrt(d)) / (2 * a);

     cout << "1 решение" << endl;

     cout << "x = " << x1 << endl;

} else   

     cout << "Решений нет" << endl;

}

 

 

Приклад програми. Робота світлофора запрограмована таким чином: на початку кожного часу протягом трьох хвилин горить зелене світло, потім протягом двох хвилин – червоне, і так далі. Дано дійсне число – час в хвилинах з початку чергового часу. Визначити, сигнал якого кольору горить на світлофорі.

 

#include <iostream>

using namespace std;

int main(){

int green = 3, red = 2, temp;

double t = 24;

temp = (int) t % (green + red);

if (temp < green)

     cout << "Green" << endl;

else

     cout << "Red" << endl;

}

 

Приклад програми. Знайти значення функції

 

#include <iostream>

using namespace std;

int main(){

setlocale(LC_ALL, "");

double x = 2.34, y;

if (x < 0)

     y = pow(x, 2);

else if (0 <= x && x < 5)

     y = sin(x) + cos(x);

else if (5 <= x && x < 10)

     y = exp(x);

else

     y = -x;

cout << y << endl;

}

Оператор вибору switch

Оператор switch іноді називають перемикачем. Він призначений для вибору одного з декількох альтернативних варіантів у разі розгалуження процесу розв’язання задачі. Структура оператора така:

 

switch (вираз_цілого_типу) {

case константа_1: оператори;

case константа_2: оператори;

case константа_n: оператори;

default:          оператори;

}

 

Після слова switch в дужках записується довільний вираз цілого типу. Кожен варіант вибору починається службовим словом case за яким вказується константа вибору (інша назва – мітка) даного варіанту. Мітки можуть бути константами або константними виразами, що мають цілочислове або символьне значення. Порядок запису варіантів вибору довільний, але всі константи повинні бути різними. Остання вітка оператора switch, яка починається службовим словом default, не є обов’язковою. У кінці оператора записується права фігурна дужка, після якої крапка з комою не ставляться.

Оператор виконує такі дії:

1) обчислює значення виразу, який керує вибором варіанта продовження процесу виконання програми;

2) це значення послідовно порівнюється зі значеннями констант вибору, доку не буде знайдено відповідну константу;

3) якщо знайдено варіант, константа вибору якого збігається зі значенням виразу, то виконуються оператори цього варіанта і всі наступні внутрішні оператори switch;

4) якщо значення виразу не збігається з жодною із констант вибору, а до складу switch входить альтернативний варіант default, то виконуються оператори варіанту default;

5) якщо в операторі немає міток, які збігаються зі значеннями виразу вибору і відсутній варіант default, то жодний з внутрішніх операторів не виконується, керування передається наступному за switch оператору.

Приклад програми. Вивести на екран назву дня тижня по його номеру.

 

#include <iostream>

using namespace std;

int main(){

int a;

cin >> a;

switch (a) {

case 1: cout << "Monday" << endl;

case 2: cout << "Tuesday" << endl;

case 3: cout << "Wednesday" << endl;

case 4: cout << "Thursday" << endl;

case 5: cout << "Friday" << endl;

case 6: cout << "Saturday" << endl;

case 7: cout << "Sunday" << endl;

default: cout << "Wrong day number" << endl;

}

}

 

Число, яке вводить користувач програми, буде збережене в змінній а. При виконанні операторі switch значення змінної а буде порівняно з константами після case. Якщо вони рівні, управляння буде передане у відповідний рядок програми, будуть виконані всі оператори, які записані після відповідної мітки. Тобто, якщо користувач введе число 6, то будуть виконані оператори

 

cout << "Saturday" << endl;

cout << "Sunday" << endl;

cout << "Wrong day number" << endl;

 

Якщо нас це не влаштовує, то необхідно використовувати оператор break, який перериває виконання оператора switch і передає управління наступному за switch оператору. Наступна програма буде працювати коректно:

 

#include <iostream>

using namespace std;

int main(){

enum week_days {Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun};

int a;

cin >> a;

switch (a) {

case Mon: cout << "Monday" << endl; break;

case Tue: cout << "Tuesday" << endl; break;

case Wed: cout << "Wednesday" << endl; break;

case Thu: cout << "Thursday" << endl; break;

case Fri: cout << "Friday" << endl; break;

case Sat: cout << "Saturday" << endl; break;

case Sun: cout << "Sunday" << endl; break;

default:  cout << "Wrong day number" << endl;

}

}

 

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

 

#include <iostream>

using namespace std;

int main(){

char menu_item;

int command;

cout << "Menu Item: "; cin >> menu_item;

cout << "Command: "; cin >> command;

switch (menu_item) {

     case 'F':

     case 'f':

           switch (command) {

                case 1: cout << "F 1" << endl; break;

                case 2: cout << "F 2" << endl; break;

                case 3: cout << "F 3" << endl; break;

           } break;

     case 'E':

     case 'e':

           switch (command) {

                case 1: cout << "E 1" << endl; break;

                case 2: cout << "E 2" << endl; break;

           } break;

     case 'H':

     case 'h':

           switch (command) {

                case 1: cout << "H 1" << endl; break;

                case 2: cout << "H 2" << endl; break;

           } break;

}

}

 

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

Оператори циклу



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 93; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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