Оператори у програмским језицима C и C++ су конструкције које се понашају на сличан начин попут функција, али се разликују синтаксно или семантички од уобичајених функција. Сви оператори наведени у табелама испод постоје у програмском језику C++; четврта колона „Укључено у C”, наводи да ли је оператор такође присутан у програмском језику C. Треба имати на уму да C не подржава преклапање оператора.
Када нису преклопљени, за операторе &&, ||, и , (оператор зареза), постоји тачка секвенце након процјене првог операнда.
C++ такође садржи операторе конверзије типа const_cast, static_cast, dynamic_cast и reinterpret_cast. Форматирање ових оператора значи да је њихов ниво приоритета неважан.
Већина оператора доступних у C и C++ су такође доступни и у другим језицима као што су C#, D, Јава, Перл и PHP са истим приоритетом, асоцијативношћу и семантиком.
Списак оператора За потребе ових табела, a, b и c представљају важеће вриједности (литерале, вриједности варијабли или повратне вриједности), називе објеката или вриједности, по потреби. R, S и T могу бити било који тип(ови), а K је класа или набројиви тип.
Аритметички оператори Назив оператора Синтакса Може бити преклопљен у C++ Укљученоу C Примјери C++ прототипаРеф. Као члан класе K Дефиниције изван класе Оператор додјеле Сабирање Одузимање Унарно сабирање Унарно одузимање Множење Дијељење Модуо (остатак при дијељењу) Инкремент Префикс width="8%" width="8%" Постфикс rowspan="2" rowspan="2" Напомена: C++ користи неименовани лажни параметар како би се разликовали префиксни и постфиксни оператори за инкрементацију. Декремент Префикс Постфикс rowspan="2" rowspan="2" Напомена: C++ користи неименовани лажни параметар како би се разликовали префиксни и постфиксни оператори за декрементацију.
Оператори поређења/релациони оператори Назив оператора Синтакса Може бити преклопљен у C++ Укљученоу C Примјери C++ прототипаРеф. Као члан класе K Дефиниције изван класе Једнакост width="8%" width="8%" Неједнакост Веће од Мање од Веће или једнако од Мање или једнако од Тростепено поређење rowspan="2" rowspan="2" Напомена: Оператор има укупно 6 повратних вриједности: , , , , , and
Логички оператори Назив оператора Синтакса Може бити преклопљен у C++ Укљученоу C Примјери C++ прототипаРеф. Као члан класе K Дефиниције изван класе Логичка негација width="8%" width="8%" Логичка конјункција Логичка дисјункција
Оператори над битовима Назив оператора Синтакса Може бити преклопљен у C++ Укљученоу C Примјери C++ прототипаРеф. Као члан класе K Дефиниције изван класе Негација ~acompl a width="8%" width="8%" Конјункција a & ba bitand b Дисјункција a | ba bitor b Искључива дисјункција a ^ ba xor b Помјерање улијево a << b Помјерање удесно a >> b
Оператори сложене додјеле Назив оператора Синтакса Значење Може бити преклопљен у C++ Укљученоу C Примјери C++ прототипаРеф. Као члан класе K Дефиниције изван класе Сабирање и додјела a += b a = a + b width="8%" width="8%" Одузимање и додјела a -= b a = a - b Множење и додјела a *= b a = a * b Дијељење и додјела a /= b a = a / b Модуо и додјела a %= b a = a % b Конјункција над битовима и додјела a &= ba and_eq b a = a & b Дисјункција над битовима и додјела a |= ba or_eq b a = a | b Искључива дисјункција над битовима и додјела a ^= ba xor_eq b a = a ^ b Помјерање битова улијево и додјела a <<= b a = a << b Помјерање битова удесно и додјела a >>= b a = a >> b
Оператори чланова и показивача Назив оператора Синтакса Може бити преклопљен у C++ Укљученоу C Примјери C++ прототипаРеф. Као члан класе K Дефиниције изван класе Индексирање a[b] width="8%" width="8%" width="25%" Дереференцирање („објекат на који показује a”) *a Адресирање („адреса од a”) &a Структурно дереференцирање („члан b објекта на који показује a”) a->b Структурно показивање („члан b објекта a”) a.b colspan="2" Члан изабран показивачем члана b објекта на који показује a a->*b Члан објекта a изабран показивачем члана b a.*b colspan="2"
Остали оператори Назив оператора Синтакса Може бити преклопљен у C++ Укљученоу C Примјери C++ прототипаРеф. Као члан класе K Дефиниције изван класе Позив функције a(a1, a2) width="8%" width="8%" width="25%" Зарез a, b Тернарни оператор a ? b : c colspan="2" Резолуција досега a::b colspan="2" Кориснички дефинисани литералиод C++11 "a"_b Sizeof sizeof(a)sizeof(type) colspan="2" величина генеричког параметраод C++11 sizeof...(Args) colspan="2" Alignofод C++11 alignof(type) or _Alignof(type) colspan="2" Идентификација типа typeid(a)typeid(type) colspan="2" Конверзија типа (конверзија у C-стилу) (type)a colspan="2" Конверзија типа type(a) Напомена: понаша се као const_cast/static_cast/reinterpret_cast static_cast конверзија static_cast<type>(a) rowspan="2" rowspan="2" since C++11 Напомена: за кориснички дефинисане конверзије, повратна вриједност се имплицитно и обавезно подудара са називом оператора. dynamic cast конверзија dynamic_cast<type>(a) colspan="2" const_cast конверзија const_cast<type>(a) colspan="2" reinterpret_cast конверзија reinterpret_cast<type>(a) colspan="2" Алокација меморије new type Алокација меморије (низ) new type[n] Ослобађање меморије delete a Ослобађање меморије (низ) delete[] a Провјера изузетакаод C++11 noexcept(a) colspan="2"
Редослијед операција У табели испод приказани су редослијед и асоцијативност свих оператора у програмским језицима C и C++ (када оператор постоји и у програмским језицима Јава, Перл, PHP и многим другим новијим програмским језицима, редослијед извршавања је исти као што је наведено). Редослијед оператора је наведен тако што су на врху оператори који се први извршавају. Група оператора која је написана у одређеном реду ће се извршити прије оператора који су наведени у редовима испод. Оператори који су наведени у истој ћелији (може бити више редова оператора написаних у истој ћелији) имају једнак приоритет у извршавању. Редослијед извршавања оператора је независан од преклапања.
Редослијед Оператор Опис Асоцијативност 1 највиши :: Резолуција досега (само у C++) нема 2 ++ Постфиксни инкремент слијева надесно -- Постфиксни декремент () Позив функције [] Индексирање низа . Селекција елемента референцом -> Селекција елемента показивачем typeid() Информације о типу за вријеме извршавања (само C++) const_cast Конверзија типа (само у C++) dynamic_cast Конверзија типа (само у C++) reinterpret_cast Конверзија типа (само у C++) static_cast Конверзија типа (само у C++) 3 ++ Префиксни инкремент здесна налијево -- Префиксни декремент + Унарни плус - Унарни минус ! Логичка негација ~ Негација над битовима (type) Конверзија типа * Дереференцирање & Адресирање sizeof Sizeof _Alignof Alignof (од C11) new, new[] Динамичка алокација меморије (само у C++) delete, delete[] Динамичко ослобађање меморије (само у C++) 4 .* Показивач на члан (само у C++)слијева надесно ->* Показивач на члан (само у C++) 5 * Множењеслијева надесно / Дијељење %Модуо (остатак) 6 + Сабирањеслијева надесно - Одузимање 7 << Помјерање улијевослијева надесно >> Помјерање удесно 8 <=> Тростепено поређење (од C++20 — само у C++)слијева надесно 9 < Мање одслијева надесно <= Мање или једнако од > Веће од >= Веће или једнако од 10 == Једнакостслијева надесно != Неједнакост 11 & Конјункција над битовимаслијева надесно 12 ^ Искључива дисјункција над битовимаслијева надесно 14 | Дисјункција над битовимаслијева надесно 14 && Логичка конјункцијаслијева надесно 15 || Логичка дисјункцијаслијева надесно 16 ?: Тернарни операторздесна налијево = Директна додјела += Сабирање и додјела -= Одузимање и додјела *= Множење и додјела /= Дијељење и додјела %= Модуо и додјела <<= Помјерање битова улијево и додјела >>= Помјерање битова удесно и додјела &= Конјункција над битовима и додјела ^= Дисјункција над битовима и додјела |= Негација над битовима и додјела throw Оператор throw (бацање изузетака, само у C++) 17 најнижи ,Зарезслијева надесно
Напомене Табела редослиједа операција одређује редослијед везања у ланчаним изразима, када заграде нису изричито одређене. На примјер, израз ++x*3 је двосмислен без неких правила везаних за редослијед. Табела редослиједа операција нам каже: x је чвршће 'везано' за ++ него за *, тако да шта год ++ ради, оно то ради само промјењивој x (а не читавом изразу x*3); ово је еквивалентно (++x, x*3). Слично томе, у изразу 3*x++, гдје, иако је оператор ++ дизајниран да дјелује након што је читав израз израчунат, табела редослиједа операција даје до знања да само x бива инкрементовано (а не цијели израз 3*x). Ово се може записати уз коришћење помоћне промјењиве tmp као (tmp=x++, 3*tmp), што је функционално еквивалентно изразима (tmp=3*x, ++x, tmp).
За апстраховање питања редослиједа или везивања, размотримо дијаграм изнад који се тиче израза 3+2*y[i]++. Посао компајлера је да растави дијаграм у израз у којем ће неколико унарних операција (назовимо их 3+( . ), 2*( . ), ( . )++ и ( . )[ i ]) да се такмиче која ће се везати за y. Табела редослиједа операција нам каже да се овај израз раставља на сљедеће: ( . )[ i ] се везује директно на y, ( . )++ се везује на y[i], 2*( . ) се везује на y[i]++, а 3+( . ) се везује за читав израз 2*((y[i])++).
Многим операторима који садрже низ више карактера додијељена су „имена” састављена од имена оператора сваког карактера. На примјер, += и -= често се зову плус једнако и минус једнако, умјесто „додјела сабирањем” и „додјела одузимањем”.
Везивање оператора у C и C++ је специфицирано неком граматиком језика, а не редослиједом извршавања. Ово ствара неке благе конфликте. На примјер, у програмском језику C, синтакса за кондиционални израз је: logical-OR-expression ? expression : conditional-expression док у C++ то изгледа овако: logical-OR-expression ? expression : assignment-expression Због тога се израз: e = a < d ? a++ : a = d парсира различито у ова два језика. У C, овај израз би „бацио” синтаксну грешку, јер би синтакса за овај израз у C била: unary-expression '=' assignment-expression У C++ се парсира као: e = (a < d ? a++ : (a = d)) што је валидан израз.
Критика редослиједа оператора једнакости и логичких оператора над битовима Критикован је редослијед извршавања логичких операција над битовима.. Концептуално, & и | су аритметичке операције попут * и +.
Израз је синтаксно парсиран као гдје је израз парсиран као . Ово захтијева чешћу употребу заграда него што је то обично случај.
Историјски, није постојала синтаксна разлика између оператора над битовима и логичких оператора. У раном програмском језику C, BCPL-у и програмском језику B, оператори нису постојали. Умјесто тога, оператори су имали другачије значење у зависности од тога да ли се користе у контексту истините вриједности (нпр. када се очекује вриједност Буловог типа, као у изразу он се понаша као логички оператор, али у се понаша као оператор над битовима). Задржан је тако да задржи повратну компатибилност с постојећим инсталацијама.
Поред тога, у C++ (и каснијим верзијама C) оператори једнакости, за изузетком оператора тростепеног поређења, дају вриједности Буловог типа које су концептуално један бит (1 или 0) и као такви не припадају операцијама над битовима.
Синоними оператора у C++ C++ дефинише одређене кључне ријечи које се понашају као алијаси за бројне операције: Кључна ријеч Оператор && &= & | ~ ! != || |= ^ ^=
Они се могу користити на исти начин попут интерпункцијских знакова које замјењују, како нису исти оператор под различитим именом, него једноставне замјене токена за име (низ карактера) одговарајућег оператора. Ово значи да изрази и имају исто значење. То такође значи да, на примјер, кључна ријеч bitand може да се користи не само приликом замјене bitwise-and оператора, него и за оператор адресирања, а такође може да се користи за одређивање референтних типова (нпр. ). Спецификација ISO C дозвољава ове кључне ријечи у претпроцесорским макроима у датотеци заглавља . Ради компатибилности са програмским језиком C, C++ садржи датотеку заглавља , чије укључивање нема ефекта.
Види још Битски оператори у програмском језику C Булова алгебра
Референце