Оператори у програмским језицима C и C++
уграђене и (у C++) функције које се могу преоптеретити From Wikipedia, the free encyclopedia
Remove ads
Оператори у програмским језицима C и C++ су конструкције које се понашају на сличан начин попут функција, али се разликују синтаксно или семантички од уобичајених функција. Сви оператори наведени у табелама испод постоје у програмском језику C++; четврта колона „Укључено у C」, наводи да ли је оператор такође присутан у програмском језику C. Треба имати на уму да C не подржава преклапање оператора.
Када нису преклопљени, за операторе &&
, ||
, и ,
(оператор зареза), постоји тачка секвенце након процјене првог операнда.
C++ такође садржи операторе конверзије типа const_cast
, static_cast
, dynamic_cast
и reinterpret_cast
. Форматирање ових оператора значи да је њихов ниво приоритета неважан.
Већина оператора доступних у C и C++ су такође доступни и у другим језицима као што су C#, D, Јава, Перл и PHP са истим приоритетом, асоцијативношћу и семантиком.
Remove ads
Списак оператора
За потребе ових табела, a
, b
и c
представљају важеће вриједности (литерале, вриједности варијабли или повратне вриједности), називе објеката или вриједности, по потреби. R
, S
и T
могу бити било који тип(ови), а K
је класа или набројиви тип.
Аритметички оператори
Оператори поређења/релациони оператори
Логички оператори
Оператори над битовима
Оператори сложене додјеле
Оператори чланова и показивача
Остали оператори
Remove ads
Редослијед операција
У табели испод приказани су редослијед и асоцијативност свих оператора у програмским језицима C и C++ (када оператор постоји и у програмским језицима Јава, Перл, PHP и многим другим новијим програмским језицима, редослијед извршавања је исти као што је наведено). Редослијед оператора је наведен тако што су на врху оператори који се први извршавају. Група оператора која је написана у одређеном реду ће се извршити прије оператора који су наведени у редовима испод. Оператори који су наведени у истој ћелији (може бити више редова оператора написаних у истој ћелији) имају једнак приоритет у извршавању. Редослијед извршавања оператора је независан од преклапања.
Напомене
Табела редослиједа операција одређује редослијед везања у ланчаним изразима, када заграде нису изричито одређене.
- На примјер, израз
++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))
што је валидан израз.[45]
Критика редослиједа оператора једнакости и логичких оператора над битовима
Критикован је редослијед извршавања логичких операција над битовима.[46] Концептуално, & и | су аритметичке операције попут * и +.
Израз a & b == 7
је синтаксно парсиран као a & (b == 7)
гдје је израз a + b == 7
парсиран као (a + b) == 7
. Ово захтијева чешћу употребу заграда него што је то обично случај.
Историјски, није постојала синтаксна разлика између оператора над битовима и логичких оператора. У раном програмском језику C, BCPL-у и програмском језику B, оператори && ||
нису постојали. Умјесто тога, оператори & |
су имали другачије значење у зависности од тога да ли се користе у контексту истините вриједности (нпр. када се очекује вриједност Буловог типа, као у изразу if (a==b & c) {...}
он се понаша као логички оператор, али у c = a & b
се понаша као оператор над битовима). Задржан је тако да задржи повратну компатибилност с постојећим инсталацијама.[47]
Поред тога, у C++ (и каснијим верзијама C) оператори једнакости, за изузетком оператора тростепеног поређења, дају вриједности Буловог типа које су концептуално један бит (1 или 0) и као такви не припадају операцијама над битовима.
Синоними оператора у C++
C++ дефинише[48] одређене кључне ријечи које се понашају као алијаси за бројне операције:
Они се могу користити на исти начин попут интерпункцијских знакова које замјењују, како нису исти оператор под различитим именом, него једноставне замјене токена за име (низ карактера) одговарајућег оператора. Ово значи да изрази (a > 0 and not flag)
и (a > 0 && !flag)
имају исто значење. То такође значи да, на примјер, кључна ријеч bitand
може да се користи не само приликом замјене bitwise-and оператора, него и за оператор адресирања, а такође може да се користи за одређивање референтних типова (нпр. int bitand ref = n
). Спецификација ISO C дозвољава ове кључне ријечи у претпроцесорским макроима у датотеци заглавља iso646.h
. Ради компатибилности са програмским језиком C, C++ садржи датотеку заглавља ciso646
, чије укључивање нема ефекта.
Remove ads
Види још
Референце
Спољашње везе
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads