Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posibnyk_C_sum.doc
Скачиваний:
9
Добавлен:
29.08.2019
Размер:
1.63 Mб
Скачать

2.4 Оголошення даних

У програмі мовою С оголошенню підлягають іменовані об’єкти: змiннi, масиви, функції, структури, об’єднання, вказiвники, дані перерахункового типу, типи, теги і класи. Не всі об’єкти потребують оголошення, наприклад, на відміну від мови Pascal, С не потребує оголошення міток. Тип кожного об’єкта повинен бути явно оголошеним за допомогою спецiальних описувачiв, які визначають базовий тип даного, клас пам’ятi та модифiкатор. Оголошення можна виконати на внутрiшньому рiвнi (блок) або на зовнiшньому (програмний модуль). Змінні, оголошені на внутрішньому рівні, є локальними, тобто їх час життя та область дії обмежується блоком. На зовнішньому рівні оголошуються глобальні змінні, їхній час життя та область дії поширюються на модуль.

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

Базовi типи даних. Вiд базового типу даних залежить об’єм пам’ятi, який вони займають. Граничні значення змінних відповідних типів визначені в бібліотеках: limits.h, float.h, stdint.h. Специфiкатори базових типiв показанi в таблицi 2.3.

Таблиця 2.3 – Базові типи даних

Тип

Назва типу

Об’єм пам’ятi, байт

char

Символьний

1

int

Цiлий

2, 4 або 8

short

Cкорочений (цілий)

2

long

Подовжений (цілий)

4

unsigned

Беззнаковий (цілий)

2

unsigned char

Беззнаковий символьний

1

unsigned short

Беззнаковий короткий (цілий)

2

unsigned long

Беззнаковий довгий (цілий)

4

float

Пересувний

4

double

Подвiйний

8

long double

Подвiйний довгий

10

До перечислених у таблиці 2.3 стандарт С90 додав тип void – порожній, він застосовується там, де зазвичайно повинні знаходитися якісь дані, але в даному випадку вони відсутні. Також стандарт С99 додав типи: long long – подвійний довгий (цілий тип для систем, які працюють з 8-байтовою адресацією), _Bool – логічний, _Complex – комплексний та _Imaginary – уявний.

Нагадаємо, що тут розглядається стандарт мови С. Окремі версії мови можуть мати свої власні типи та займати інший об’єм пам’яті. Тоді мова С набуває ширших, але не вужчих, ніж у стандарті, можливостей. Зокрема, практично всі сучасні компілятори надають типу int об’єм пам’яті не 2, а 4 та навіть 8 байт.

Нижче наведено приклади застосування базових типів даних у оголошеннях:

int k, j;

long double x1;

char c;

float x, y;

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

int k=3, j=25;

char p, s='я';

Тут оголошені дві змінні типу int: k та j, які під час оголошення одержать значення відповідно 3 та 25. Далі оголошені дві змінні типу char, з яких змінна p не буде ініціалізована, та – s, яка прийме значення літери кирилиці “я”.

Залежно від характеру зберігання в пам’яті комп’ютера дані, позначені перечисленими тут типами, можна поділити на два сімейства: цілі і дійсні. Розглянемо тип char, він означає літеру, текст. Але в пам’яті зберігається не буква, а її ASCII-код (ASCII – American Standart Code for Information Interchange – американський стандартний код обміну інформацією). Цей код охоплює цілі додатні числа від 0 до 127, його застосовують для зберігання в пам’яті всіх символів вищеописаного алфавіту мови С. За його допомогою можна закодувати 128 символів, для цього достатньо 7 біт, але відводиться 8 біт, тобто цілий байт, який дозволяє кодувати до 256 символів. Враховуючи цю можливість, більшість систем використовують розширені ASCII-коди, де додано символи, наприклад, букви кирилиці.

Слід, однак, зауважити, що, оскільки багато наборів символів перевищує 256 значень (наприклад, японські ієрогліфи), існують також інші системи кодування, зокрема Unicod, яка складає більше 96000 символів. В цих системах тип char займатиме 16, 32 або більше біт. Компілятори, які забезпечують такі типи char у межах цього посібника не розглядаються.

Програмісти часто використовують тип char для зберігання малих чисел від 0 до 255. Наприклад, змінну c, яка приймає значення букви 'a' латини, можна оголосити двома способами: char c='a'; або char c=97; В обох випадках змінну c можна застосовувати у виразах як число цілого типу, яке тут дорівнює 97. Додамо, що ASCII-код букви 'a' дорівнює 97, коди решти малих букв латини зростають на одиницю в алфавітному порядку. Коди букв від '0' до '9' починаються з 48, їх можна застосувати для перетворення коду одноцифрової букви в однорозрядне число, віднявши від коду число 48. Наприклад, код букви '3' дорівнює 51, тоді число 3 дорівнюватиме 51- 48, або '3'- 48.

Застосування типу char є неефективним у тих системах, де довжина адресованої комірки складає 2 та більше байт, бо використовується лише один байт, а решта вільні. Тому деякі компілятори дозволяють записувати в одну велику комірку (наприклад, 8 байт) по декілька літер.

Ціле число типу int – це число, яке не має дробової частини. Вище вже говорилося про те, що константи цілого типу можна представити в програмі в різних системах числення, та незалежно від цього в пам’яті вони будуть зберігатися тільки в двійковій, тобто компілятор перекладе кожне ціле число в двійкову систему числення. Візьмемо, наприклад, число 11. У 8-й системі числення воно дорівнює 013 (1*81+3*80=11), у 16-й – 0xВ (В= десятковому 11). Після перекладу в двійкову систему числення воно дорівнюватиме 1011 (1*23+0*22+1*21+1*20=11). Якщо воно буде записано в двобайтову (16-бітову) комірку пам’яті, то прийме такий вигляд: 0000 0000 0000 1011, тобто старші розряди числа будуть доповнені нулями. Якщо це число буде від’ємним (-11), то в комірці пам’яті найстарший двійковий розряд дорівнюватиме одиниці, а число матиме вигляд: 1000 0000 0000 1011 (у знакорозмірному представленні).

Тип short застосовується в тих випадках, коли приходиться працювати з невеликими числами, за рахунок його застосування можна зекономити пам’ять.

Комірка пам’яті типу long удвічі довша за int, але лише в 16-розрядних комп’ютерах. У 32-розрядних обидва типи: int і long можуть займати по 4 байти, а тип short – 2 байти.

Як бачимо, мова С має аж п’ять цілих типів даних: char, short, int, long та long long. Їх явно забагато, але виникли вони в процесі розвитку обчислювальної техніки і свого часу себе оправдали. Тип long long дозволяє обробляти цілі числа ± 9 223 372 036 854 775 807. Це вже дуже широкий діапазон, тому можна надіятися, що розвиток систем у напрямку зростання розрядності чисел на цьому зупиниться.

Заслуговуть на увагу беззнакові типи (unsigned). Візьмемо, наприклад, тип unsigned (тобто unsigned int, якщо int не вказано, то відповідно до стандарту С90 воно приймається за замовчуванням). У два байти пам’яті можна помістити максимально можливе додатнє число 216 - 1 = 65535. Але знаковий тип використовує перший біт для знака, якщо число від’ємне, то в цьому біті буде записана одиниця, інакше – 0. Тому знаковий тип міститиме лише ±215-1 = ±32767, тобто в два рази менше додатнє або від’ємне число. За замовчуванням приймається саме знаковий тип. За рахунок використання типу unsigned змінна може містити вдвоє більше, правда лише додатнє, число. Цей приклад демонструє особливі властивості мови С, програмісту надається можливість економити пам’ять, навіть хоча б один біт.

Типи float, double і long double призначені для дійсних чисел, тобто таких, що складаються з цілої та дробової частин. Між собою вони відрізняються тим, що займають різні об’єми пам’яті. Незалежно від форми представлення (з фіксованою чи пересувною крапкою) кожне дійсне число зберігається у двійковій системі числення, а, оскільки під час перекладу числа в двійковий код іноді відкидаються молодші розряди, то втрачається його точність. Покажемо це на прикладі. Нехай під мантису числа 0,3 буде відведено 16 розрядів. У двійковій системі числення воно дорівнює 0,(0100), тобто маємо періодичний дріб. Тоді в пам’ять буде записано лише 0100010001000100, решта молодших розрядів будуть втрачені, тому воно буде представляти менше за 0,3 десяткове число. Те ж може статися також із цілим числом. Нехай число дорівнює 3,0. У нормалізованому вигляді та представлене в формі з пересувною крапкою воно має вигляд 0,3*101, тобто має таку ж мантису, як у розгляненому вище прикладі. Таким чином, число 3, записане в комірку пам’яті типу float, може не дорівнювати числу 3 типу int. Слід, однак, зауважити, що існує ціла низка прийомів для розробки таких компіляторів, де подібна ситуація контролюється і практично не виникає.

Для запам’ятовування логічних даних типу _Bool достатньо одного біта, де 0 означатиме false, 1 – true, хоча в залежності від розрядності комп’ютера цей тип займе декілька байт.

Класи пам’ятi. Мова С передбачає використання таких специфiкаторiв класiв пам’ятi: extern, static, auto i register. Специфiкатори static i extern застосовуються на зовнiшньому (в окремому модулi, файлi) або внутрiшньому (в блоцi) рiвнi, auto i register – тiльки на внутрiшньому. Оголошення класу extern означає, що така змiнна буде визначена (iнiцiалізована) в iншому мiсцi (модулi) програми, а також, що вона може бути доступною (використаною) до визначення. Змiнну класу static компiлятор iнiцiалiзує нулем, якщо її значення не задано явно пiд час оголошення. Значення змiнних класу static зберiгаються в пам’ятi пiсля виходу з того блоку, де вони оголошенi, i можуть бути повторно використанi. Змiннi класу extern i static помiщаються в сегмент статичних даних програми, auto – в стек, register – у вiльнi регiстри мiкропроцесора, якщо це можливо (є вiльне мiсце). Якщо в оголошеннi функцiй клас не вказаний, то за замовчуванням мається на увазi extern, для iнших даних – auto.

Таблиця 2.4 – Класи пам’яті

Клас пам’ятi

Область дiї

Час життя

extern

програмний блок

програмний блок

static зовнiшнiй

модуль (файл)

програмний блок

static внутрiшнiй

блок

програмний блок

auto

блок

блок

register

блок

блок

Вiд класу пам’ятi залежить час життя i область дiї даних, це показано в таблицi 2.4.

Приклади опису з вказанням класу: extern a; auto int i; Тут оголошенi двi змiннi, змiнна a має клас пам’ятi extern, це означає, що вона буде ініціалізована в iншому програмному модулi, її можна використовувати протягом часу виконання всiєї програми, за замовчуванням їй присвоєно тип int. Змiнна i має тип int, вона доступна лише в тому блоцi, де оголошена. Після завершення виконання цього блоку (виходу з нього) об’єм пам’яті, який займала ця змінна буде звільнений і може бути зайнятий іншою змінною.

Модифiкатоpів є декiлька, вони перечислені нижче.

const, volatile, restrict.

Змiнна типу const не може бути змiнена в процесi виконання програми. Модифiкатор volatile протилежний за змiстом, вiн повiдомляє компiлятор, що ця змiнна може бути змiнена в будь-який момент програмою, пристроєм вводу-виводу або з порта, тому для виразiв, де вона є, не потрiбно застосовувати методи оптимiзацiї, а саму змiнну не слiд завантажувати в машиннi регiстри. Приклад застосування модифікатора:

const float pi=3.1415926;

Тут оголошена змінна pi типу float, під час оголошення задано її значення 3.1415926, яке не може бути зміненим під час виконання програми. У випадку спроби його змінити компілятор видасть помилку.

Кваліфікатор restrict доданий стандартом С99, він застосовується до вказівників, що вказують на об’єкти (наприклад, масиви даних), якими зайняті області пам’яті гарантовано не перекриваються іншими даними.

cdecl, pascal, asm, fortran.

Цi модифiкатори дозволяють компонувати програму з модулiв, написаних рiзними мовами. Модифiкатор cdecl застосовується для оголошення функцiї, написаної мовою С i означає, що вона може бути викликана з програми мовою Паскаль. Модифiкатори pascal, asm i fortran означають, що iдентифiкатори змiнних або функцiй, які мають цi модифікатори, знаходяться в програмах, написаних мовами вiдповiдно Паскаль, Асемблер чи Фортран.

near, far, huge.

Ці модифікатори призначені для використання переважно в ранніх версіях мови С які працювали з 16-розрядними комп’ютерами. За їх допомогою можна встановлювати певну модель пам’ятi. Зауважимо, що сучасні комп’ютери мають 4-байтову (32-розрядну), а найновіші – 8-байтову адресацію. Тому відпадає необхідність в обмеженні об’єму пам’яті для даних та функцій різними моделями пам’яті.

В оголошенні необхідно вказати хоча б щось одне: базовий тип, клас або модифікатор. Якщо базовий тип явно не оголошений, то за замовчуванням приймається int (крім стандарту С99).

Мова С дозволяє виконувати ініціалізацію змінних під час їх оголошення, наприклад, вираз float x=23.456; означає, що під час компіляції програми змінній x буде виділена пам’ять довжиною 4 байти і туди буде записано число 23,456. За замовчуванням змінна x матиме клас пам’яті auto.

Тип даних можна змінювати в ході виконання програми. Нехай, наприклад, маємо такі оголошення змінних:

int n=48, k, s, w;

char c='a', b='2', d;

float p=35,64;

Тоді після виконання операторів присвоєння:

k=p;

s=c;

w=b;

d=n;

матимемо такі значення:

k=35 – дробова частина числа буде втрачена;

s=97 – ASCII-код букви 'а' шрифтом латини;

w=50 – ASCII-код символа '2';

d='0', бо ASCII-код символа '0' дорівнює 48.

2.5 Cтандартні функцiї

Мова С характерна наявнiстю порiвняно великої кiлькості стандартних функцiй. Це функцiї вводу-виводу, математичнi, обробки даних лiтерного типу, графiчнi, обробки помилок та інші. За рахунок їх використання вдалося розробити компактний компілятор, який не займає багато пам’яті, та зробити коротшими самі програми, бо для кожної конкретної задачі під’єднуються лише потрібні функції. Звертання до функцiї здiйснюється шляхом вказання у вiдповiдному мiсцi програми її iменi, пiсля якого в круглих дужках дається перелiк параметрiв. Кожна функцiя повертає якесь значення – результат її виконання. Для того, щоб функцiя могла бути використаною, до програми повинен бути пiд’єднаним за допомогою директиви препроцесору #include файл, де ця функцiя описана. Нижче в прикладах дається опис окремих функцiй i їх параметрiв.

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

2.6 Операцiї

За кiлькiстю операндiв операцiї подiляються на унарнi, бiнарнi i тренарнi. Вони поданi в таблицi 2.5.

Унарний плюс (+) або мінус (-) використовуються для визначення знака числа. Якщо знак не вказаний, то за замовчуванням приймається плюс (додатнє число).

Якщо перед змінною стоїть операція тільда (~ зворотній код), то в результаті її виконання всі одиниці будуть замінені на нулі і навпаки.

Нехай, наприклад, маємо двійкове число 0000 0010 (десяткове 2), тоді ~(0000 0010)=1111 1101 (десяткове 253).

Таблиця 2.5 – Знаки операцій

Знак

Найменування операції

Знак

Найменування операції

Унарні

+, -

Унарний плюс та унарний мiнус

~

Зворотнiй код (тiльда)

!

Логiчне заперечення (“НЕ”)

sizeof

Розмiр у байтах

&

Адресацiя об’єкта

*

Непряма адресацiя

++

Збiльшення на одиницю

--

Зменшення на одиницю

Бiнарнi

+, -

Додавання, вiднiмання

*, /

Множення, дiлення

%

Залишок вiд дiлення

,

Послiдовне виконання

<<

Зсув улiво

>>

Зсув управо

&

Порозрядне “I”

|

Порозрядне включне “АБО”

&&

Логiчне “I”

||

Логiчне “АБО”

>, <

Бiльше, менше

^

Виключне “АБО”

>=

Бiльше або дорiвнює

<=

Менше або дорiвнює

==

Дорiвнює (порiвняння)

!=

Не дорiвнює

=

Просте присвоєння

-=

Присвоєння з вiднiманням

+=

Присвоєння з додаванням

*=

Присвоєння з множенням

/=

Присвоєння з дiленням

%=

Присвоєння з залишком від ділення

<<=

Присвоєння зi зсувом уліво

>>=

Присвоєння зi зсувом управо

^=

Присвоєння з виключним “АБО”

|=

Присвоєння з включним “АБО”

&=

Присвоєння з порозрядним “I”

Тренарна операцiя: операнд1 ? операнд2 : операнд 3

Вище вже говорилося про те, що мова C (стандарт С90) не оперує константами логічного типу, тобто не має значень true (так) або false (ні), натомість використовується відповідно 1 або 0 – числа типу int. Разом з тим, як видно з таблиці 2.5, мова має операції відношень та логічні операції. Тому результатом унарної операції ! (логічне заперечення) у виразах логічного типу буде саме 0 або 1. Наприклад, результатом виразу 2<3 буде 1 (тобто правда, так), а !(2<3) дорівнюватиме 0 (тобто не 1). Значенням виразу !1 так же, як !2, !3 і т.д., теж буде нуль.

Операція sizeof() служить для визначення кількості байт, яку займає об’єкт. Нехай, наприклад, маємо дві змінні: int k; float s; Тоді після виконання операції k=sizeof(s); значення змінної k дорівнюватиме кількості байт, яку займає змінна s (k = 4).

Мова С має широкі можливості для роботи безпосередньо з адресами пам’яті, для цього служать операції: адресація (&) і непряма адресація (*) об’єкта. Прийоми роботи з ними покажемо на прикладі. Нехай маємо змінні:

float x=7.55, g, *p=&x;

Тут оголошена змінна p типу адреси, під час оголошення вона ініціаліазована адресою змінної x, тобто їй присвоєно значення адреси змінної x. Тоді після виконання оператора g = *p; (він читається так: присвоїти змінній g значення, яке знаходиться під адресою p) змінна g прийме значення 7,55. Цей приклад можна показати інакше:

float x=7.55, g, *p;

p=&x;

g=*p;

Одержимо ті ж результати.

Звернемо увагу на те, що змінна типу адреси (в останньому прикладі це змінна p) може бути тільки цілою. Описувач float означає не тип її, а крок, з яким розміщуються дані в пам’яті машини. Цим іноді користуються програмісти. Нехай, наприклад, маємо такі оголошення:

int a=23, b=46, *m=&a, n;

Тут змінній m присвоєно значення адреси змінної a. Після виконання команди n=*(m+1); змінна n прийме значення 46, тобто значення змінної b, яка знаходиться далі на один крок типу int від змінної a. Додамо, що компілятор розміщує дані в пам’яті машини в тій послідовності, в якій вони перечислені під час оголошення.

Змінні адресного типу, тобто призначені для запам’ятовування адрес, називаються вказівниками.

За допомогою операції ++ (інкремент) можна збільшувати, а -- (декремент) – зменшувати число на одиницю. Наприклад, маємо оголошення: int i=5; Тоді після виконання операції i++; значення змінної і дорівнюватиме 6, а після i--; – числу 4. Має значення місце встановленя операцій інкремент та декремент у виразах – перед змінною чи після неї. Якщо вони стоять після змінної, то спочатку ця змінна використовується, а потім нарощується. Нехай, наприклад, маємо такі вирази:

int k = 3, a, b;

a = 2*k++;

b=2*++k;

Обчислення будуть відбуватися в такій послідовності:

k=3, a = 6, k=4, k=5 , b=10.

Операція % (залишок вiд дiлення) призначена для отримання залишку від ділення двох цілих чисел. Наприклад, значення виразу 10%3 дорівнюватиме 1.

Операцію , (кома – послідовне виконання) застосовують там, де зазвичайно знаходиться один вираз, а потрібно помістити два. Таке може статися, наприклад, у заголовку оператора циклу.

Операції << та >> (зсув) дозволяють зсунути відповідно вліво або вправо двійковий код комірки пам’яті на задану кількість розрядів. Нехай, наприклад, маємо такі оператори:

int k=5, n;

n=k<<2;

Двійковий код числа 5 дорівнює 101. В комірку n воно запишеться зміщеним на два розряди вліво (в сторону старшого розряду), тобто дорівнюватиме 10 100 (під час зміщення звільнені молодші розряди заповняться нулями). Тоді в десятковій системі числення одержимо:

n = 1*24 + 0*23 + 1*22 + 0*21 + 0*20 = 16 + 0 + 4 + 0 + 0 = 20.

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

Як уже вище зазначалося, результатом виконання логічних операцій мовою С є ціле число нуль або одиниця, а не логічні значення true або false, які мають інші мови програмування. Навіть ті компілятори, які відповідно до стандарту С99 мають ці логічні значення, сприймають їх як відповідно 1 або 0. Результати виконання логічних операцій показані в таблиці 2.6.

Таблиця 2.6 – Результати обчислення логічних виразів

a

b

!a

~a

a && b

a & b

a || b

a | b

a ^ b

1

1

0

0

1

1

1

1

0

1

0

0

0

0

0

1

1

1

0

1

1

1

0

0

1

1

1

0

0

1

1

0

0

0

0

0

Наведемо декілька прикладів. Значення виразу 2<3 && 5 дорівнює 1. Тут 2<3 дорівнює 1 (правда), 5 дорівнює 101 (у двійковій системі числення), воно містить аж дві одиниці, тому вважається теж правдою. Отже 1 && 1 = 1.

Операції && – логiчне “I”, та & – порозрядне “I” відрізняються між собою. Під час виконання виразів з порозрядним “I” перевіряється на співпадання кожний розряд. Наприклад, 5&&3=1. Представимо ці вирази двійковою системою числення, тоді 101&&11=1, бо обидва операнди – і лівий, і правий містять одиниці (взагалі – хоча б одну, а тут аж по дві). А результат виконання виразу 5&3=001 (101&011=001).

Подібно до цього виконуються й операції || – логічного “АБО” та | – порозрядного включного “АБО”. Наприклад, результатом виразу 5||3 буде число 1, бо обидва операнди мають по дві одиниці (а потрібно хоча б одну. Результатом виразу 5|3, тобто 101|011, буде число 111, бо в усіх трьох розрядах на відповідних місцях обох двійкових операндів міститься хоча б одна одиниця (з двох у різних числах). Операція ^ – порозрядного виключного “АБО” відрізняється від порозрядного включного “АБО” тим, що результат дорівнює нулю тоді, коли обидва операнди – одиниці. Наприклад, в результаті виконання виразу 5^3 (101^011) отримаємо 110, бо крайні праві (наймолодші) розряди обидвох операндів містять по одиниці.

Результатами операцій відношення мовою С теж будуть нулі або одиниці. Вони виконується подібно до загальноприйнятих. Слід лише особливо підкреслити, що операція порівняння мовою С на відміну від більшості інших мов програмування, має вигляд: == (два знаки =). Оскільки тип виразу мовою С не регламентується, то компілятор його не контролює, тому в тих місцях програми, де може бути логічний вираз, дозволено писати й один знак =, який тоді означає операцію присвоєння.

Операцiї з присвоєнням означають одночасно двi операцiї, наприклад, нарощення змiнної s на 2,3 можна виконати такими двома способами: s=s+2.3; або s+=2.3; На другий спосіб машина затратить менше часу, ніж на перший, бо в першому випадку адреса змінної s буде згенерована двічі: перед її викликом на суматор і під час запису назад в оперативну пам’ять після зміни, а в другому – лише один раз.

Тренарна операцiя виконується так: якщо значення операнд1 = 0, то результат = операнд3, iнакше – операнд2. Наприклад, значенням виразу 2<3?7:18 буде число 7, виразу 3?7:18 – теж число 7, виразу 1?2:3 – число 2, а виразу 0?2:3 – число 3.

Тренарні операції можуть бути вкладеними. Наприклад, якщо відомо значення змінної den – порядковий день місяця, то порядковий номер декади (десятиденки) можна знайти з такого виразу:

den<11?1:den<21?2:3.

2.7 Вирази

Один і той же вираз мовою С може містити знаки всіх операцій, перечислених у розділі 2.5, константи і змiнні будь-якого типу, функцiї та круглі дужки, тому вираз не має типу. Запропонуємо визначати тип виразу за типом результату. Тоді у виразі арифметичного типу дані літерного типу будуть перетворені на числа – коди літер, а результатами виконання логічних операцій та операцій відношення буде нуль або одиниця (як про це говорилося в розділі 2.6).

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

Деякі компілятори дозволяють включати у символьні вирази операцію додавання, який у цьому випадку служить для з’єднання між собою декількох рядків символiв (конкатенація) та утворення одного рядка.

Круглі дужки служать для зміни приорітету виконання операцій. Наприклад, у виразі (a+b)/2 першою виконається операція додавання, а в виразі a+b/2 – ділення.

2.8 Оператори

Оператором називають одиничну, логiчно завершену iнструкцiю для ЕОМ. У програмi наприкінці кожного оператора ставиться знак крапка з комою. Будь який оператор програми може мати мiтку, яка ставиться перед ним, вiддiляється вiд нього двокрапкою i являє собою iдентифiкатор. Мова С має такі оператори:

  • оператор-вираз. Найбiльш вживаним є оператор присвоєння, який складається з операцiї присвоєння, злiва вiд якої ставиться iм’я змiнної, а зправа – вираз, значення якого присвоюється цiй змiннiй;

  • порожнiй оператор, він має вигляд крапки з комою. Вживається там, де згiдно з синтаксисом повинен бути оператор, а він відсутній;

  • оператор безумовного переходу goto;

  • умовний оператор if;

  • оператор-перемикач switch;

  • оператор простого (покрокового) циклу for;

  • оператор циклу з передумовою while;

  • оператор циклу з постумовою do–while;

  • оператор припинення break;

  • оператор продовження continue;

  • оператор повернення з пiдпрограми return;

  • блок, один або декiлька операторiв, взятих у фiгурнi дужки.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]