русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Пріоритет і послідовність обчислення


Дата додавання: 2014-11-28; переглядів: 982.


Таблиця 2.1 підбиває підсумок правил пріоритету й асоціативності всіх операторів, включаючи ті, що ми ще не обговорювали. Оператори, розміщені на одному рядку — рівні за пріоритетом; рядки знаходяться в порядку зменшення пріоритету, тож, наприклад, *, / та % мають однаковий пріоритет, який є вищим за, скажімо, бінарні + та -. «Оператор» () стосується виклику функції. Оператори -> із . використовуються для доступу до членів структур; їх буде розглянуто вРозділі 6 разом із функцією sizeof (яка визначає розмір об'єкту). В Розділі 5 обговорюється *(непряме звертання через покажчик) а також & (адреса об'єкту), тоді як в Розділі 3 розглянуто оператор-кому.

Таблиця 2.1 Пріоритет і асоціативність операторів
Оператори Асоціативність
() [] -> . з ліва на право
! ~ ++ -- + - * (тип) sizeof з права на ліво
* / % з ліва на право
+ - з ліва на право
<< >> з ліва на право
< <= > >= з ліва на право
== != з ліва на право
& з ліва на право
^ з ліва на право
| з ліва на право
&& з ліва на право
|| з ліва на право
?: з права на ліво
= += -= *= /= %= &= ^= |= <<= >>= з права на ліво
, з ліва на право
Унарні &, +, - та * мають вищий пріоритет за відповідні бінарні форми.

Зверніть увагу, що пріоритет розрядних операторів &, ^ та | нижчий за == та !=. З цього випливає, що вирази перевірки бітів на зразок

if ((x & MASK) == 0) ...

повинні обов'язково містити дужки, щоб добитися бажаного результату.

C, як і більшість мов, не уточнює послідовність в якій обчислюються операнди якогось оператора. (Виняток становлять &&, ||, ?: та «,».) Так, наприклад, у твердженні

x = f() + g();

f може бути обчислено до g або навпаки; тож, якщо функція f або g змінює якусь змінну, від якої залежить інша з цих функцій, тоді x також залежатиме від порядку обчислення. Проміжні результати можуть зберігатися в тимчасових змінних, щоб забезпечити певну послідовність. Аналогічно, порядок в якому розглядаються аргументи функцій, також не уточнюється, тож вираз

printf("%d %d\n", ++n, power(2, n)); /* ПОМИЛКА */

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

++n;

printf("%d %d\n", n, power(2, n));

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

a[i] = i++;

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

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


<== попередня лекція | наступна лекція ==>
Вирази умов | If-else


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн