Оператори в C та C++: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
Aldionoro (обговорення | внесок)
Немає опису редагування
EmausBot (обговорення | внесок)
м r2.7.3) (робот змінив: hu, ja, ko, zh; косметичні зміни
Рядок 7:
Більшість операторів C та C++ також використовуються у мовах [[C Sharp (мова програмування)|C#]], [[Java (мова програмування)|Java]], [[Perl]], та [[PHP]] з тими самими приорітетом, асоціативністю та семантикою.
 
== Таблиця ==
В даній таблиці, символи <code>a</code>, <code>b</code>, та <code>c</code> представляють будь-які дійсні значення (літерали, значення змінних, або повернені значення), імена об'єктів або інші значення що мають адресу.
 
"Можливість перевантаження" означає, що даний оператор може бути [[Перевантаження операторів|перевантажений]] засобами C++, але не у мові С, оскільки вона не підтримує перевантаження операторів.<br />"Присутній у C" означає що даний оператор існує і має семантичний зміст у мові C.
 
=== Арифметичні оператори ===
{| class="wikitable" style="width:100%"
! colspan="2" rowspan="2" | Ім'я оператора
! rowspan="2" | Синтаксис
! rowspan="2" | Можливість перевантаження
! rowspan="2" align="center" | Присутній у <br />[[C (мова програмування)|C]]
! colspan="2" | Приклади прототипів (T будь-якого типу)
|-
Рядок 38:
| {{cpp|1=T operator -(const T& a, const T& b);}}
|-
| colspan="2" | [[Унарна операція|Унарний]] плюс ([[Type conversion#Type_promotionType promotion|integer promotion]])
| style="text-align:center;" | <code>'''+'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator +() const;}}
Рядок 94:
|}
 
=== Оператори порівняння/відношення ===
{| class="wikitable" style="width:100%"
! colspan="2" rowspan="2" | &nbsp;&nbsp;&nbsp;Оператор&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;
! rowspan="2" | &nbsp;&nbsp;Синтаксис&nbsp;&nbsp;
! rowspan="2" | Можливість перевантаження
! rowspan="2" | Присутній у<br />[[C (мова програмуваня)|C]]
! colspan="2" | Приклади прототипів (T будь-якого типу)
|-
Рядок 138:
|}
 
=== Логічні оператори ===
{| class="wikitable" style="width:100%"
! colspan="2" rowspan="2" | Ім'я оператора
! rowspan="2" | &nbsp;&nbsp;Синтаксис&nbsp;&nbsp;
! rowspan="2" | Можливість перевантаження
! rowspan="2" | Присутній у<br />[[C (мова програмуваня)|C]]
! colspan="2" | Приклади прототипів (T будь-якого типу)
|-
Рядок 167:
|}
 
=== Побітові оператори ===
{| class="wikitable" style="width:100%"
! colspan="2" rowspan="2" | Ім'я оператора
! rowspan="2" | &nbsp;&nbsp;Синтаксис&nbsp;&nbsp;
! rowspan="2" | Можливість перевантаження
! rowspan="2" | Присутній у<br />[[C (мова програмуваня)|C]]
! colspan="2" | Приклади прототипів (T будь-якого типу)
|-
Рядок 211:
|}
 
=== Оператори призначення компонентів ===
{| class="wikitable" style="width:100%"
! colspan="2" rowspan="2" | Ім'я оператора
Рядок 217:
! rowspan="2" | &nbsp;&nbsp;Сенс&nbsp;&nbsp;
! rowspan="2" | Можливість перевантаження
! rowspan="2" | Присутній у<br />[[C (мова програмуваня)|C]]
! colspan="2" | Приклади прототипів (T будь-якого типу)
|-
Рядок 304:
|}
 
=== Операції з покажчиками та членами ===
{| class="wikitable" style="width:100%"
! colspan="2" rowspan="2" | Ім'я оператора
! rowspan="2" | Синтаксис
! rowspan="2" | Можливість перевантаження
! rowspan="2" | Присутній у<br />[[C (мова програмуваня)|C]]
! colspan="2" | Приклади прототипів (T, T2 та R будь-якого типу)
|-
Рядок 319:
| width="8%" {{yes}}
| width="8%" {{yes}}
| {{cpp|1=R& T::operator [](const T2& b);}}<br />
| width="25%" {{n/a}}
|-
Рядок 334:
| colspan="2" | Розкриття посилання на структуру ("на член ''b'' об'єкту вказує ''a''")
| style="text-align:center;" | <code>a'''->'''b</code> || {{yes}} || {{yes}}
| {{cpp|1=R* T::operator ->();}}<br />
| {{n/a}}
|-
Рядок 351:
|}
 
=== Інші оператори ===
{| class="wikitable" style="width:100%"
! colspan="2" rowspan="2" | Ім'я оператора
! rowspan="2" | Синтаксис
! rowspan="2" | Можливість перевантаження
! rowspan="2" | Присутній у<br />[[C (мова програмуваня)|C]]
! colspan="2" | Приклади прототипів (T, R, Arg1 та Arg2 будь-якого типу)
|-
Рядок 362:
! Поза описом класу
|-
| width="18%" colspan="2" | Виклик [[Функція (програмування)|Функції]]<br />'' Дивись [[Функтор (програмування)|Функтор]]''.
| width="16%" align="center" | <code>a'''('''a1, a2''')'''</code>
| width="8%" {{yes}}
Рядок 383:
|-
| colspan="2" | Отримання розміру
| style="text-align:center;" | <code>'''sizeof'''(a)</code><ref name="sizeof" group="Прим"/><br /><code>'''sizeof'''(''type'')</code> || {{no}} || {{yes}}
| colspan="2" {{n/a}}
|-
| colspan="2" | Отримання [[Вирівнювання даних|вирівнювання]]
| style="text-align:center;" | <code>'''alignof'''(''type'')</code> <br /> or <code>'''_Alignof'''(''type'')</code><ref name="alignof" group="Прим"/> || {{no}} || {{yes}}
| colspan="2" {{n/a}}
|-
| colspan="2" | Ідентифікація типу
| style="text-align:center;" | <code>'''typeid'''(a)</code><br /><code>'''typeid'''(''type'')</code> || {{no}} || {{no}}
| colspan="2" {{n/a}}
|-
Рядок 438:
}}
 
== Приорітет операторів ==
У наступій таблиці вказано приорітет та асоціативність усіх операторів мов [[C (мова програмування)|C]] та [[C++]] (якщо будь-який з вказаних операторів існує [[Java (мова програмування)|Java]], [[Perl]], [[PHP]] або інший сучасних мовах, його приорітет, скоріш за все, буде таким самим). Оператори вказані в порядку зниження приорітету зверху вниз. Зниження приорітету відноситься до приорітету обчисленнь. В процесі обчислення виразу, оператор вказаний у певному рядку таблиці, буде обчислений раніше за оператор, вказаний у будь-якому нижчому за нього рядку. Оператори, вказані в одній комірці, обчислюються з однаковим приорітетом в порядку їх запису у виразі. При перевантаженні, приорітет оператора не змінюється.
 
Рядок 652:
|}
 
=== Примітки ===
 
Таблиця приорітету визначає порядок застосування (поєднання) операторів у складних виразах, коли цей порядок не заданий явно за допомогою круглих дужок.
Рядок 658:
* Наприклад, вираз <code>++x*3</code> без застосування правил приорітету має певну двозначність. Таблиця приорітету каже нам, що: <tt>x</tt> тісніше 'пов'язаний' з <tt>++</tt> ніж з <tt>*</tt>, тому щоб не робив оператор <tt>++</tt> (зараз чи пізніше), він робитиме це ТІЛЬКИ з <tt>x</tt> (а не з <code>x*3</code>); це еквівалентно виразу (<code>++x</code>, <code>x*3</code>).
* Аналогічним чином, для виразу <code>3*x++</code>, де постфіксний оператор інкременту <tt>++</tt> хоча і призначений діяти ПІСЛЯ обчислення усього виразу, але таблиця приорітетів ясно вказує, що не зважаючи на це, інкрементується ТІЛЬКИ <tt>x</tt> (а не <code>3*x</code>); це еквівалентно виразу подібному до (<code>tmp=3*x</code>, <code>++x</code>, <code>tmp</code>), де <tt>tmp</tt> є тимчасовим значенням.
[[ImageФайл:Precedence 2.png|center|thumb|Приорітет та поєднання]]
* Зобразимо проблему приорітету операторів та їх поєднання у вигляді діаграми. Завданням компілятора є перетворення цієї діаграми у вираз, в якому декілька унарних операторів ( назвемо їх 3+( . ), 2*( . ), ( . )++ та ( . )[ i ] ) конфліктують за поєднання з y. Проблема вирішується за допомогою таблиці приорітету, яка дозволяє сформувати остаточний набір виразів: ( . )[ i ] діє тільки на y, ( . )++ діє тільки на y[i], 2*( . ) діє тільки на y[i]++ та 3+( . ) діє 'тільки' на 2*((y[i])++). Важливо зазначити, що таблиця дозволяє визначити ЯКИЙ з виразів буде задіяний кожним з операторів, але відповіді на питання "КОЛИ кожний оператор вступить в дію", таблиця не дає. В даному прикладі оператор ( . )++ діє тільки на y[i] за правилами таблиці, але самі по собі рівні поєднання не визначають час виконання суфікса ++ (оператор ( . )++ буде задіяний лише після обчислення у виразі елементу y[i]).
 
Рядок 707:
}}
 
== Зовнішні посилання ==
* [http://cppreference.com/wiki/language/operators C++ Operators]
* [http://msdn.microsoft.com/en-us/library/e1e3921c(VS.80).aspx Prefix vs. Suffix operators in C and C++]
Рядок 715:
[[en:Operators in C and C++]]
[[es:Anexo:Operadores de C y C++]]
[[hu:OperatorokOperátorok (C++)]]
[[ja:C?C++????の演算子]]
[[ko:C?C와 C++???에서의 ???연산자]]
[[mk:Оператори во C и C++]]
[[pt:Operadores em C e C++]]
[[zh:C?C++???運算子]]