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

3.8 Goto та мітки

C також надає один з операторів, яким часто зловживають — goto, а також мітки для переходу в дане місце виконання програми. Формально, goto ніколи не потрібний і практично майже завжди можна написати код, уникаючи його. Ми не використовували goto в цій книзі.

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

for ( ... )

for ( ... ) {

...

if (невдача)

goto error;

}

...

error:

/* очистити безлад */

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

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

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

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

for (j = 0; j < m; j++)

if (a[i] == b[j])

goto found;

/* у протилежному випадку не знайдено */

...

found:

/* знайдено: a[i] == b[j] */

...

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

found = 0;

for (i = 0; i < n && !found; i++)

for (j = 0; j < m && !found; j++)

if (a[i] == b[j])

found = 1;

if (found)

/* знайдено: a[i-1] == b[j-1] */

...

else

/* не знайдено спільних елементів */

...

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

Розділ 4: Функції та структура програм

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

C задумана, щоб зробити функції ефективними та легкими у використанні; програми на C, як правило, складаються з багатьох малих функцій, замість кількох великих. Сама програма може знаходитись в одному або декількох вихідних файлах. Вихідні тексти можна компілювати окремо і завантажити разом, поряд з попередньо-компільованими функціями бібліотеки. Ми не будемо заглиблюватись у цей процес тут, оскільки подробиці можуть відрізнятися в різних операційних системах.

Оголошення й означення функцій — це саме та область, де стандарт ANSI здійснив найбільші зміни в мові C. Як ми вже бачили у Розділі 1, тепер з'явилася можливість опису типу аргументів під час оголошення функцій. Синтаксис визначення функції також змінився, тож оголошення та визначення збігаються. Це дозволяє тепер компілятору вловити набагато більше помилок, ніж раніше. Більше того, коли аргументи оголошено належним чином, відповідні поправки типів здійснюються автоматично.

Стандарт прояснює правила області дії імен, зокрема він вимагає, щоб існувало тільки одне визначення для кожного зовнішнього об'єкту. Ініціалізація стала більш загальною: тепер можна започатковувати автоматичні масиви і структури.

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

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