Пріоритет і порядок виконання

Книга містить повний опис найбільш поширених реалізацій мови програмування Сі на 16-розрядних мікроЕОМ, сумісних з IBM PC. Наведено опис стандартних бібліотек мови.

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

Книга: Мова програмування Сі для персонального комп'ютера

Пріоритет і порядок виконання

Пріоритет і порядок виконання

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

У таблиці 4.1 наведені операції в порядку убування пріоритету. Операції, розташовані в одному рядку таблиці, або об'єднані в одну групу, мають однаковий пріоритет і однакову асоціативність.

Пріоритет і асоціативність операцій в мові Сі

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

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

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

а = b 0xFF + 5

а = b (0xFF + 5),

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

В СП ТС реалізована операція унарна плюса, що дозволяє гарантувати порядок обчислення виразів в дужках.

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

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

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

z = х> у || f (x, у);

Спочатку обчислюється вираз х> у. Якщо воно істинне, то змінної z присвоюється значення 1, а функція f не викликається. Якщо ж значення х не більш у, то обчислюється вираз f (x, y). Якщо функція f повертає нульове значення, то змінної z присвоюється 1, інакше 0. Відзначимо також, що при виконанні функції f гарантується, що значення її перший аргумент більше другого.

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

if (! feof (pf)) (З = getc (pf)) ...

Тут feof - функція перевірки на кінець файлу, getc - функція читання символу з файлу (див. Розділ 12).

По-третє, можна гарантувати, що в вираженні f (x) g (y) функція f буде викликана раніше, ніж функція g. Для вираження f (x) + g (y) цього стверджувати не можна.

У наступних прикладах показано групування операндів для різних виразів.