Оператори у програмским језицима C и C++

С Википедије, слободне енциклопедије

Оператори у програмским језицима 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 Дефиниције изван класе
Оператор додјеле a '''=''' b Да Да R& K::operator =(S b); Н/Д [1]
Сабирање a '''+''' b Да Да R K::operator +(S b); R operator +(K a, S b); [2]
Одузимање a '''-''' b Да Да R K::operator -(S b); R operator -(K a, S b); [2]
Унарно сабирање '''+'''a Да Да R K::operator +(); R operator +(K a); [3]
Унарно одузимање '''-'''a Да Да R K::operator -(); R operator -(K a); [3]
Множење a '''*''' b Да Да R K::operator *(S b); R operator *(K a, S b); [4]
Дијељење a '''/''' b Да Да R K::operator /(S b); R operator /(K a, S b); [4]
Модуо (остатак при дијељењу) a '''%''' b Да Да R K::operator %(S b); R operator %(K a, S b); [4]
Инкремент Префикс '''++'''a Да Да R& K::operator ++(); R& operator ++(K& a); [5]
Постфикс a'''++''' Да Да R K::operator ++(int); R operator ++(K& a, int); [6]
Напомена: C++ користи неименовани лажни параметар int како би се разликовали префиксни и постфиксни оператори за инкрементацију.
Декремент Префикс '''--'''a Да Да R& K::operator --(); R& operator --(K& a); [5]
Постфикс a'''--''' Да Да R K::operator --(int); R operator --(K& a, int); [6]
Напомена: C++ користи неименовани лажни параметар int како би се разликовали префиксни и постфиксни оператори за декрементацију.

Оператори поређења/релациони оператори[уреди | уреди извор]

Назив оператора Синтакса Може бити преклопљен у C++ Укључено
у C
Примјери C++ прототипа Реф.
Као члан класе K Дефиниције изван класе
Једнакост a '''==''' b Да Да bool K::operator ==(S const& b) const bool operator ==(K const& a, S const& b) [7]
Неједнакост a '''!=''' b
a '''not_eq''' b
Да Да bool K::operator !=(S const& b) bool K::operator !=(S const& b) const bool operator !=(K const& a, S const& b) [7]
Веће од a '''>''' b Да Да bool K::operator >(S const& b) const bool operator >(K const& a, S const& b) [7]
Мање од a '''<''' b Да Да bool K::operator <(S const& b)const bool operator <(K const& a, S const& b) [7]
Веће или једнако од a '''>=''' b Да Да bool K::operator >=(S const& b) const bool operator >=(K const& a, S const& b) [7]
Мање или једнако од a '''<=''' b Да Да bool K::operator <=(S const& b) bool operator <=(K const& a, S const& b) [7]
Тростепено поређење a '''&lt;=&gt;''' b Да Не std::weak_equality K::operator <=>(const S &b) std::weak_equality operator <=>(const K &a, const S &b) [7]
Напомена: Оператор има укупно 6 повратних вриједности: std::weak_equality, std::strong_equality, std::partial_ordering, std::weak_ordering, std::strong_ordering, and std::common_comparison_category [8]

Логички оператори[уреди | уреди извор]

Назив оператора Синтакса Може бити преклопљен у C++ Укључено
у C
Примјери C++ прототипа Реф.
Као члан класе K Дефиниције изван класе
Логичка негација '''!'''a
'''not''' a
Да Да bool K::operator !(); bool operator !(K a); [9]
Логичка конјункција a '''&&''' b
a '''and''' b
Да Да bool K::operator &&(S b); bool operator &&(K a, S b); [10]
Логичка дисјункција a '''||''' b
a '''or''' b
Да Да bool K::operator ||(S b); bool operator ||(K a, S b); [11]

Оператори над битовима[уреди | уреди извор]

Назив оператора Синтакса Може бити преклопљен у C++ Укључено
у C
Примјери C++ прототипа Реф.
Као члан класе K Дефиниције изван класе
Негација ~a
compl a
Да Да R K::operator ~(); R operator ~(K a); [12]
Конјункција a & b
a bitand b
Да Да R K::operator &(S b); R operator &(K a, S b); [13]
Дисјункција a | b
a bitor b
Да Да R K::operator |(S b); R operator |(K a, S b); [14]
Искључива дисјункција a ^ b
a xor b
Да Да R K::operator ^(S b); R operator ^(K a, S b); [15]
Помјерање улијево a << b Да Да R K::operator <<(S b); R operator <<(K a, S b); [16]
Помјерање удесно a >> b Да Да R K::operator >>(S b); R operator >>(K a, S b); [16]

Оператори сложене додјеле[уреди | уреди извор]

Назив оператора Синтакса Значење Може бити преклопљен у C++ Укључено
у C
Примјери C++ прототипа Реф.
Као члан класе K Дефиниције изван класе
Сабирање и додјела a += b a = a + b Да Да R& K::operator +=(S b); R& operator +=(K& a, S b); [17]
Одузимање и додјела a -= b a = a - b Да Да R& K::operator -=(S b); R& operator -=(K& a, S b); [17]
Множење и додјела a *= b a = a * b Да Да R& K::operator *=(S b); R& operator *=(K& a, S b); [17]
Дијељење и додјела a /= b a = a / b Да Да R& K::operator /=(S b); R& operator /=(K& a, S b); [17]
Модуо и додјела a %= b a = a % b Да Да R& K::operator %=(S b); R& operator %=(K& a, S b); [17]
Конјункција над битовима и додјела a &= b
a and_eq b
a = a & b Да Да R& K::operator &=(S b); R& operator &=(K& a, S b); [17]
Дисјункција над битовима и додјела a |= b
a or_eq b
a = a | b Да Да R& K::operator |=(S b); R& operator |=(K& a, S b); [17]
Искључива дисјункција над битовима и додјела a ^= b
a xor_eq b
a = a ^ b Да Да R& K::operator ^=(S b); R& operator ^=(K& a, S b); [17]
Помјерање битова улијево и додјела a <<= b a = a << b Да Да R& K::operator <<=(S b); R& operator <<=(K& a, S b); [17]
Помјерање битова удесно и додјела a >>= b a = a >> b Да Да R& K::operator >>=(S b); R& operator >>=(K& a, S b); [17]

Оператори чланова и показивача[уреди | уреди извор]

Назив оператора Синтакса Може бити преклопљен у C++ Укључено
у C
Примјери C++ прототипа Реф.
Као члан класе K Дефиниције изван класе
Индексирање a[b] Да Да R& K::operator [](S b);
Н/Д [18]
Дереференцирање („објекат на који показује a”) *a Да Да R& K::operator *(); R& operator *(K a); [19]
Адресирање („адреса од a”) &a Да Да R* K::operator &(); R* operator &(K a); [20]
Структурно дереференцирање („члан b објекта на који показује a”) a->b Да Да R* K::operator ->(); Н/Д [21]
Структурно показивање („члан b објекта a”) a.b Не Да Н/Д [21]
Члан изабран показивачем члана b објекта на који показује a a->*b Да Не R& K::operator ->*(S b); R& operator ->*(K a, S b); [22]
Члан објекта a изабран показивачем члана b a.*b Не Не Н/Д [22]

Остали оператори[уреди | уреди извор]

Назив оператора Синтакса Може бити преклопљен у C++ Укључено
у C
Примјери C++ прототипа Реф.
Као члан класе K Дефиниције изван класе
Позив функције a(a1, a2) Да Да R K::operator ()(S a, T b, ...); Н/Д [23]
Зарез a, b Да Да R K::operator ,(S b); R operator ,(K a, S b); [24]
Тернарни оператор a ? b : c Не Да Н/Д [25]
Резолуција досега a::b Не Не Н/Д [26]
Кориснички дефинисани литерали
од C++11
"a"_b Да Не Н/Д R operator "" _b(T a) [27]
Sizeof sizeof(a)
sizeof(type)
Не Да Н/Д [28]
величина генеричког параметра
од C++11
sizeof...(Args) Не Не Н/Д [29]
Alignof
од C++11
alignof(type)
or _Alignof(type)
Не Да Н/Д [30]
Идентификација типа typeid(a)
typeid(type)
Не Не Н/Д [31]
Конверзија типа (конверзија у C-стилу) (type)a Не Да Н/Д [32]
Конверзија типа type(a) Не Не Напомена: понаша се као const_cast/static_cast/reinterpret_cast[33] [34]
static_cast конверзија static_cast<type>(a) Да Не K::operator R();
explicit K::operator R(); since C++11
Н/Д [35]
Напомена: за кориснички дефинисане конверзије, повратна вриједност се имплицитно и обавезно подудара са називом оператора.
dynamic cast конверзија dynamic_cast<type>(a) Не Не Н/Д [36]
const_cast конверзија const_cast<type>(a) Не Не Н/Д [37]
reinterpret_cast конверзија reinterpret_cast<type>(a) Не Не Н/Д [38]
Алокација меморије new type Да Не void* K::operator new(size_t x); void* operator new(size_t x); [39]
Алокација меморије (низ) new type[n] Да Не void* K::operator new[](size_t a); void* operator new[](size_t a); [39]
Ослобађање меморије delete a Да Не void K::operator delete(void *a); void operator delete(void *a); [40]
Ослобађање меморије (низ) delete[] a Да Не void K::operator delete[](void *a); void operator delete[](void *a); [40]
Провјера изузетака
од C++11
noexcept(a) Не Не Н/Д [41]

Редослијед операција[уреди | уреди извор]

У табели испод приказани су редослијед и асоцијативност свих оператора у програмским језицима 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

најнижи

, Зарез слијева надесно

[42][43][44]

Напомене[уреди | уреди извор]

Табела редослиједа операција одређује редослијед везања у ланчаним изразима, када заграде нису изричито одређене.

  • На примјер, израз ++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] одређене кључне ријечи које се понашају као алијаси за бројне операције:

Кључна ријеч Оператор
and &&
and_eq &=
bitand &
bitor |
compl ~
not !
not_eq !=
or ||
or_eq |=
xor ^
xor_eq ^=

Они се могу користити на исти начин попут интерпункцијских знакова које замјењују, како нису исти оператор под различитим именом, него једноставне замјене токена за име (низ карактера) одговарајућег оператора. Ово значи да изрази (a > 0 and not flag) и (a > 0 && !flag) имају исто значење. То такође значи да, на примјер, кључна ријеч bitand може да се користи не само приликом замјене bitwise-and оператора, него и за оператор адресирања, а такође може да се користи за одређивање референтних типова (нпр. int bitand ref = n). Спецификација ISO C дозвољава ове кључне ријечи у претпроцесорским макроима у датотеци заглавља iso646.h. Ради компатибилности са програмским језиком C, C++ садржи датотеку заглавља ciso646, чије укључивање нема ефекта.

Види још[уреди | уреди извор]

Референце[уреди | уреди извор]

  1. ^ „The Anatomy of the Assignment Operator”. icu-project.org. Приступљено 31. 10. 2019. 
  2. ^ а б mikeblome. „Additive Operators: + and -”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  3. ^ а б mikeblome. „Unary Plus and Negation Operators: + and -”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  4. ^ а б в „Operators - C++ Tutorials”. www.cplusplus.com. Приступљено 31. 10. 2019. 
  5. ^ а б mikeblome. „Prefix Increment and Decrement Operators: ++ and --”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  6. ^ а б mikeblome. „Postfix Increment and Decrement Operators: ++ and --”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  7. ^ а б в г д ђ е „Comparison operators - cppreference.com”. en.cppreference.com. Приступљено 31. 10. 2019. 
  8. ^ „Mathematics behind Comparison #4: Three-Way Comparison”. foonathan.net (на језику: енглески). Приступљено 31. 10. 2019. 
  9. ^ mikeblome. „Logical Negation Operator: !”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  10. ^ mikeblome. „Logical AND Operator: &&”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  11. ^ mikeblome. „Logical OR operator:”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  12. ^ mikeblome. „One's Complement Operator: ~”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  13. ^ mikeblome. „Bitwise AND Operator: &”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  14. ^ mikeblome. „Bitwise inclusive OR operator:”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  15. ^ mikeblome. „Bitwise Exclusive OR Operator: ^”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  16. ^ а б mikeblome. „Left Shift and Right Shift Operators (>> and”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  17. ^ а б в г д ђ е ж з и „IBM Knowledge Center”. www.ibm.com (на језику: енглески). Приступљено 31. 10. 2019. 
  18. ^ mikeblome. „Subscript Operator []”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  19. ^ mikeblome. „Indirection Operator: *”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  20. ^ mikeblome. „Address-of Operator: &”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  21. ^ а б mikeblome. „Member Access Operators: . and ->”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  22. ^ а б mikeblome. „Pointer-to-Member Operators: .* and ->*”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  23. ^ mikeblome. „Function Call Operator: ()”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  24. ^ mikeblome. „Comma Operator: ,”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  25. ^ mikeblome. „Conditional Operator: ? :”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  26. ^ mikeblome. „Scope Resolution Operator: ::”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  27. ^ „User-defined literals (since C++11) - cppreference.com”. en.cppreference.com. Приступљено 31. 10. 2019. 
  28. ^ mikeblome. „sizeof Operator”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  29. ^ „Parameter pack(since C++11) - cppreference.com”. en.cppreference.com. Приступљено 31. 10. 2019. 
  30. ^ mikeblome. „__alignof Operator”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  31. ^ mikeblome. „typeid Operator”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  32. ^ mikeblome. „Cast Operator: ()”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  33. ^ „Explicit type conversion - cppreference.com”. en.cppreference.com. Приступљено 31. 10. 2019. 
  34. ^ mikeblome. „Explicit Type Conversion Operator: ()”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  35. ^ mikeblome. „static_cast Operator”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  36. ^ mikeblome. „dynamic_cast Operator”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  37. ^ mikeblome. „const_cast Operator”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  38. ^ mikeblome. „reinterpret_cast Operator”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  39. ^ а б mikeblome. „new Operator (C++)”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  40. ^ а б mikeblome. „delete Operator (C++)”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  41. ^ mikeblome. „noexcept (C++)”. docs.microsoft.com (на језику: енглески). Приступљено 31. 10. 2019. 
  42. ^ „C Operator Precedence - cppreference.com”. en.cppreference.com. Приступљено 16. 7. 2019. 
  43. ^ „Visual Studio 2005 Retired documentation”. Microsoft Download Center. Приступљено 23. 3. 2018. 
  44. ^ „C++ Operator Precedence - cppreference.com”. en.cppreference.com. Приступљено 16. 7. 2019. 
  45. ^ „Does the C/C++ ternary operator actually have the same precedence as assignment operators?”. Stack Overflow. Приступљено 22. 9. 2019. 
  46. ^ C history § Neonatal C, Bell labs .
  47. ^ „Re^10: next unless condition”. www.perlmonks.org. Приступљено 5. 11. 2019. 
  48. ^ ISO/IEC 14882:1998(E) Programming Language C++. www.open-std.org — The C++ Standards Committee. 1. 9. 1998. стр. 40—41. 

Спољашње везе[уреди | уреди извор]