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

4.8 Структура блоків

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

if (n > 0) {

int i; /* оголошення нової i */

for (i = 0; i < n; i++)

...

}

зоною дії змінної i є «істинне» відгалуження if; це не матиме жодного стосунку до жодного i поза межами цього блока. Автоматичну змінну, оголошену та ініційовану у блоці, ініційовано кожний раз при входженні у цей блок.

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

int x;

int y;

f(double x)

{

double y;

}

змінна x, як параметр функції f типу double, немає нічого спільного з зовнішньою x типу int. Те саме стосується змінної y. Але, загалом, краще уникати назв змінних, що співпадають з назвами з інших зон дії, занадто велика ймовірність плутанини і помилок.

4.9 Ініціалізація

Про ініціалізацію мимоходом вже згадувалося багато разів, але зважди периферійно, як частина іншої теми. Цей розділ підводить підсумок декяких правил, після того як ми оговорили різноманітні типи зберігання. У випадку відсутності явної ініціалізації, зовнішні і статичні змінні буде гарантовано надано значення нуль. Автоматичні і регістрові змінні матимуть невизначене початкове значення (тобто непотріб).

Скалярні змінні можуть бути ініційованими під час їхнього визначення шляхом додачі до їхньої назви знака рівності і виразу:

int x = 1;

char squota = '/'';

long day = 1000L * 60L * 60L * 24L; /* мілісекунд у день */

Для зовнішніх і статичних змінних, ініціалізатор повинен бути сталим виразом; ініціалізація бідбувається один раз, концептуально до того як програма починає виконуватись. Для автоматичних і регістрових змінних, ініціалізатор не обов'язково повинен бути константою: це може бути будь-який вираз, включаючи попередьно-визначенні значення, навіть виклики функцій. Так, наприклад, ініціалізацію в програмі бінарного пошуку з Розділу 3.3 може бути написано як

int binsearch(int x, int v[], int n)

{

int low = 0;

int high = n - 1;

int mid;

...

}

замість

int low, high, mid;

low = 0;

high = n - 1;

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

Масив може бути ініційовано через додання до оголошення списку ініціалізаторів, включених у фігурні дужки і розділених комою. Як приклад — ініціалізація масиву days з кількістю днів кожного місяця:

int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

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

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

Символьні масиви — це спеціальний випадок ініціалізаторів: можна використати ланцюжок замість нотації з фігурних дужок і ком:

char pattern[] = "ould";

що є скороченням для довшого, але рівнозначного

char pattern[] = { 'o', 'u', 'l', 'd', '\0' };

У обох випадках, масив складатиметься з п'яти елементів: чотири літери і кінцевий '\0'.

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