Қатысушы:Asaparaliyeva/зертхана

Уикипедия — ашық энциклопедиясынан алынған мәлімет
Jump to navigation Jump to search


Операторлар тілдерінде с және с++[өңдеу]

Бұл тізімде операторлар тіл бағдарламалауы C және C++. Барлық аталған операторларда C++ бар. Сондай-ақ, ескеріңіз C шамадан тыс операторларды қолдамайды.

Артық жүктелмеген кезде, операторлар үшін &&||, және ,(үтір операторы), бірінші операнды бағалаудан кейін реттілік нүктесі қолданылады.

C++ құрамында, операторлар түрлендіру типтері const_cast,static_cast,dynamic_cast, және reinterpret_cast бар. Бұл операторларды пішімдеу олардың басымдылық деңгейі маңызды емес екенін білдіреді.

C және C ++ операторларының көпшілігі C, D, C-отбасы тілдерінде де қол жетімді. Perl және PHP бірдей басымдық көрсетеді, ассоциативті және семантикалы.

Кесте[өңдеу]

Осы кестелердің мақсаттары үшін,a,b, және cжарамды мәндері (әріптері, айнымалы мәндер немесе қайтару мәні), нысан атаулары сәйкес келеді.R, Sжәне Tкез-келген типке (стандартқа), ал сынып типіне немесе санамаланған типке арналған K жатады.

Арифметикалық операторлар[өңдеу]

Оператордың аты Синтаксис Шамадан тыс жүктей алады С енгізілген С++ прототипінің мысалдары
К мүшесі ретінде Сыныптан тыс анықтамалар
Негізгі тапсырма a = b Иә Иә 1=R& K::operator =(S b); Ж/Е
Қосу a + b Иә Иә 1=R K::operator +(S b); 1=R operator +(K a, S b);
Бөлу a - b Иә Иә 1=R K::operator -(S b); 1=R operator -(K a, S b);
Бүтін санды жылжыту +a Иә Иә 1=R K::operator +(); 1=R operator +(K a);
Біржақты минус -a Иә Иә 1=R K::operator -(); 1=R operator -(K a);
Көбейту a * b Иә Иә 1=R K::operator *(S b); 1=R operator *(K a, S b);
Бөлу a / b Иә Иә 1=R K::operator /(S b); 1=R operator /(K a, S b);
Модуль (бүтін сан) a % b Иә Иә 1=R K::operator %(S b); 1=R operator %(K a, S b);
Көбею Префикс ++a Иә Иә 1=R& K::operator ++(); 1=R& operator ++(K& a);
Постфикс a++ Иә Иә 1=R K::operator ++(int); 1=R operator ++(K& a, int);
Ескертпе: C++ префикс пен постфиксті өсіру операторларын ажырату үшін int аты аталмаған абсолютті параметрді қолданады.
Азаю Префикс --a Иә Иә 1=R& K::operator --(); 1=R& operator --(K& a);
Постфикс a-- Иә Иә 1=R K::operator --(int); 1=R operator --(K& a, int);
Ескертпе: C++ префикс пен постфиксті өсіру операторларын ажырату үшін int аты аталмаған абсолютті параметрді қолданады.

Салыстыру операторлары / байланыс операторлары[өңдеу]

Оператордың аты Синтаксис Шамадан тыс жүктей алады С енгізілген Прототиптердің мысалдары
К мүшесі ретінде Сыныптан тыс анықтамалар
Тең a == b Иә Иә 1=bool K::operator ==(S const& b) const; 1=bool operator ==(K const& a, S const& b);
Тең емес a != b
a not_eq b
Иә Иә 1=bool K::operator !=(S const& b); 1=bool K::operator !=(S const& b) const; 1=bool operator !=(K const& a, S const& b);
Үлкенірек a > b Иә Иә 1=bool K::operator >(S const& b) const; 1=bool operator >(K const& a, S const& b);
Одан азырақ a < b Иә Иә 1=bool K::operator <(S const& b) const; 1=bool operator <(K const& a, S const& b);
Үлкен немесе оған тең a >= b Иә Иә {{1=bool K::operator >=(S const& b) const;}} {{1=bool operator >=(K const& a, S const& b);}}
Кем немесе оған тең a <= b Иә Иә 1=bool K::operator <=(S const& b); 1=bool operator <=(K const& a, S const& b);
Үш жақты салыстыру a <=> b Иә Жоқ 1=std::weak_equality K::operator <=>(const S &b); 1=std::weak_equality operator <=>(const K &a, const S &b);
Ескертпе: Оператордың жалпы 6 қайтару түрі бар: std::weak_equality, std::strong_equality, std::partial_ordering, std::weak_ordering, std::strong_ordering, and std::common_comparison_category

Логикалық операторлар[өңдеу]

Оператордың аты Синтаксис Шамадан тыс жүктей алады С енгізілген С ++ прототипінің мысалдары
К мүшесі ретінде Сыныптан тыс анықтамалар
Логикалық теріске шығару (ЖОҚ) !a
not a
Иә Иә 1=bool K::operator !(); 1=bool operator !(K a);
Логикалық ЖӘНЕ a && b
a and b
Иә Иә 1=bool K::operator &&(S b); 1=bool operator &&(K a, S b);
Logical OR a || b
a or b
Иә Иә 1=bool K::operator (S b); 1=bool operator (K a, S b);

Биттік операторлар[өңдеу]

Оператордың аты Синтаксис Шамадан тыс жүктей алады С енгізілген Прототиптердің мысалдары
К мүшесі ретінде Сыныптан тыс анықтамалар
Биттік ЖОҚ ~a
compl a
Иә Иә 1=R K::operator ~(); 1=R operator ~(K a);
Биттік ЖӘНЕ a & b
a bitand b
Иә Иә 1=R K::operator &(S b); 1=R operator &(K a, S b);
Биттік НЕМЕСЕ a | b
a bitor b
Иә Иә 1=R K::operator (S b); 1=R operator (K a, S b);
Биттік ХОР a ^ b
a xor b
Иә Иә 1=R K::operator ^(S b); 1=R operator ^(K a, S b);
Биттік сол жақ ауысым a << b Иә Иә 1=R K::operator <<(S b); 1=R operator <<(K a, S b);
Биттік оң жақ ауысым a >> b Иә Иә 1=R K::operator >>(S b); 1=R operator >>(K a, S b);

Құрама тағайындау операторлары[өңдеу]

Оператордың аты Синтаксис Мағынасы Шамадан тыс жүктей алады С енгізілген С++ прототипінің мысалдары
К мүшесі ретінде Сыныптан тыс анықтамалар
Қосымша тапсырма a += b a = a + b Иә Иә 1=R& K::operator +=(S b); 1=R& operator +=(K& a, S b);
Азайту тапсырма a -= b a = a - b Иә Иә 1=R& K::operator -=(S b); 1=R& operator -=(K& a, S b);
Көбейту тапсырмасы a *= b a = a * b Иә Иә 1=R& K::operator *=(S b); 1=R& operator *=(K& a, S b);
Бөлу тапсырмасы a /= b a = a / b Иә Иә 1=R& K::operator /=(S b); 1=R& operator /=(K& a, S b);
Модульдік тапсырма a %= b a = a % b Иә Иә 1=R& K::operator %=(S b); 1=R& operator %=(K& a, S b);
Биттік тапсырма(және) a &= b
a and_eq b
a = a & b Иә Иә 1=R& K::operator &=(S b); 1=R& operator &=(K& a, S b);
Биттік тапсырма (немесе) a |= b
a or_eq b
a = a | b Иә Иә 1=R& K::operator (S b); 1=R& operator (K& a, S b);
Биттік тапсырма ХОР a ^= b
a xor_eq b
a = a ^ b Иә Иә 1=R& K::operator ^=(S b); 1=R& operator ^=(K& a, S b);
Биттік сол жақ тапсырма a <<= b a = a << b Иә Иә 1=R& K::operator <<=(S b); 1=R& operator <<=(K& a, S b);
Биттік оң жақ тапсырма a >>= b a = a >> b Иә Иә 1=R& K::operator >>=(S b); 1=R& operator >>=(K& a, S b);

Мүше және көрсеткіш операторлары[өңдеу]

Оператордың аты Синтаксис Шамадан тыс жүктей алады С енгізілген С ++ прототипінің мысалдары
К мүшесі ретінде Сыныптан тыс анықтамалар
Астын сызу a[b] Иә Иә 1=R& K::operator [](S b);
Ж/Е
Жанама («нысан a » арқылы көрсетілген) *a Иә Иә 1=R& K::operator *(); 1=R& operator *(K a);
Мекен-жайы («мекен-жайы a ») &a Иә Иә 1=R* K::operator &(); 1=R* operator &(K a);
Құрылымның бұзылуы («мүше a «арқылы көрсетілген нысан b ) a->b Иә Иә 1=R* K::operator ->(); Ж/Е
Құрылым анықтамасы («мүше b нысанның a ») a.b Жоқ Иә Ж/Е
Таңдаған мүше (мүшеден-мүшеге) a көрсетілген нысанның b a->*b Иә Жоқ 1=R& K::operator ->*(S b); 1=R& operator ->*(K a, S b);
Нысан мүшесі а таңдалған bмүше-мүшеге a.*b Жоқ Жоқ Ж/Е

Басқа операторлар[өңдеу]

Оператордың аты Синтаксис Шамадан тыс жүктей алады С енгізілген Прототиптердің мысалдары
К мүшесі ретінде Сыныптан тыс анықтамалар
Функция объектісі a(a1, a2) Иә Иә 1=R K::operator ()(S a, T b, ...); Ж/Е
Үтір a, b Иә Иә 1=R K::operator ,(S b); 1=R operator ,(K a, S b);
Үштік шартты a ? b : c Жоқ Иә Ж/Е
Ауқымды ажырату операторы a::b Жоқ Жоқ Ж/Е
Пайдаланушы анықтаған әріптері C++ 11 бастап "a"_b Иә Жоқ Ж/Е 1=R operator "" _b(T a);
Көлемі sizeof(a)sizeof(type) Жоқ Иә Ж/Е
Параметр пакетінің мөлшері
C++11 бастап
sizeof...(Args) Жоқ Жоқ Ж/Е
Туралау
C++11 бастап
alignof(type)
or _Alignof(type)
Жоқ Иә Ж/Е
Түрді сәйкестендіру typeid(a)
typeid(type)
Жоқ Жоқ Ж/Е
Айырбастау (С стиліндегі құйма) (type)a Иә Иә 1=K::operator R(); Ж/Е
Айырбастау type(a) Жоқ Жоқ Ескертпе: сияқты әрекет const_cast/static_cast/reinterpret_cast C ++ тілінде.
static_cast түрлендіру static_cast<type>(a) Иә Жоқ 1=K::operator R();
1=explicit K::operator R();C++11 бастап
Ж/Е
Ескертпе: пайдаланушы анықтаған түрлендірулер үшін, қайтару түрі толықтай және міндетті түрде оператордың атына сәйкес келеді.
dynamic cast түрлендіру dynamic_cast<type>(a) Жоқ Жоқ Ж/Е
const_cast түрлендіру const_cast<type>(a) Жоқ Жоқ Ж/Е
reinterpret_cast түрлендіру reinterpret_cast<type>(a) Жоқ Жоқ Ж/Е
Жадты бөліңіз new type Иә Жоқ 1=void* K::operator new(size_t x); 1=void* operator new(size_t x);
Жадты бөлу (массив) new type[n] Иә Жоқ 1=void* K::operator new[](size_t a); 1=void* operator new[](size_t a);
Сақтауды бөліңіз delete a Иә Жоқ 1=void K::operator delete(void *a); 1=void operator delete(void *a);
Сақтауды бөлу (массив) delete[] a Иә Жоқ 1=void K::operator delete[](void *a); 1=void operator delete[](void *a);
Ерекшеліктерді тексеру
C++11 бастап
noexcept(a) Жоқ Жоқ Ж/Е

Оператордың басымдылығы[өңдеу]

Төменде C және C ++ тілдеріндегі барлық операторлардың артықшылығы мен ассоциативтілігі көрсетілген кесте берілген (операторлар Java, Perl, PHP және басқа да көптеген соңғы тілдерде берілген кезде, артықшылық себеппен бірдей болады). Операторлар төмендеуінен жоғарыдан төменге қарай тізімделеді. Кему басымдылығы операторлар мен операндаларды топтастырудың басымдылығын білдіреді Өрнекті ескере отырып, кейбір жолдарда тізімделетін оператор оның астындағы жолда көрсетілген кез келген операторға дейін топтастырылады. Бір ұяшықта орналасқан операторлар (ұяшықта бірнеше оператор қатарлары болуы мүмкін) дәл сол бағытта топтастырылған. Оператордың артықшылығына артық жүктеме әсер етпейді.

C және C ++ өрнектерінің синтаксисі сөйлем құрылымының грамматикасымен анықталған. Мұнда берілген кесте грамматикадан алынған.ISO C 1999 стандарты үшін 6.5.6-ескертпеде 71-бөлімде спецификацияда келтірілген С грамматикасы С операторларының басымдығын анықтайтындығы, сондай-ақ грамматикадан туындайтын оператордың артықшылығы спецификацияның бөлім ретіне сәйкес келетіні айтылған:

Басымдық кестесі көбінесе жеткілікті болғанмен, бірнеше бөлшектерді шеше алмайды. Атап айтқанда, үшінші оператор кез-келген еркін өрнектерге өзінің ортаңғы операндары ретінде тағайындалуына және үтір операторларына қарағанда басымдыққа ие екендігіне назар аударыңыз. Осылайша a ? b, c : d ретінде түсіндіріледі a ? (b, c) : d, және мағынасыз (a ? b), (c : d). Сонымен, шартты оператордың ортасындағы өрнек (арасында ? және :) жақша тәрізді талдайды. Сондай-ақ, C өрнегінің нәтижесі операнд бола алмайтындығын ескеріңіз sizeof. Сондықтан, sizeof (int) * x ретінде түсіндіріледі (sizeof(int)) * x және sizeof ((int) * x) емес.

Басымдық Оператор Сипаттамасы Қауымдастық
1 :: Ауқымдылығы (тек C++) Жоқ
2 ++ Постфиксті өсіру Солдан оңға қарай
-- Постфикс декреті
() Функцияны шақыру
[] Массивтің астын сызу
. Элементті сілтеме бойынша таңдау
-> Меңзер арқылы элементтерді таңдау
typeid() Жұмыс уақыты туралы ақпарат (тек C++) (typeid)
const_cast Типті құю (тек C++) (const_cast)
dynamic_cast Типті құю (тек C++) (динамикалық құйма)
reinterpret_cast Типті құю (тек C++) (reinterpret_cast)
static_cast Типті құю (тек C++) (static_cast)
3 ++ Префиксті өсіру Оңнан солға
-- Префиксті азайту
+ Унарлы плюс
- Унарлы минус
! Логикалық ЖОҚ
~ Биттік ЖОҚ (Бірінің толықтыруы)
(type) Типті құю
* Жанама (дербестігі)
& Мекен-жайы
sizeof Көлемі
_Alignof Туралау талабы (C11)
new, new[] Динамикалық жадыны бөлу (тек C++)
delete, delete[] Динамикалық жадыны бөлу (тек C++)
4 .* Мүшеге сілтеме (тек C++) Солдан оңға қарай
->* Мүшеге сілтеме (тек C++)
5 * Көбейту Солдан оңға қарай
/ Бөлу
% Модуль (қалғаны)
6 + Қосу Солдан оңға қарай
- Бөлу
7 << Биттік солға бұрылу Солдан оңға қарай
>> Биттік оңға бұрылу
8 <=> Үш жақты салыстыру (C ++ 20 енгізілген - тек C++) Солдан оңға қарай
9 < Азырақ Солдан оңға қарай
<= Аз немесе тең
> Үлкенірек
>= Үлкен немесе тең
10 == Тең Солдан оңға қарай
!= Тең емес
11 & Биттік ЖӘНЕ Солдан оңға қарай
12 ^ Биттік ХОР (айрықша немесе) Солдан оңға қарай
13 | Биттік ХОР (айрықша немесе) Солдан оңға қарай
14 && Логикалық ЖӘНЕ Солдан оңға қарай
15 || Логикалық НЕМЕСЕ Солдан оңға қарай
16 ?: Үштік шартты Оңнан солға
= Тікелей тапсырма
+= Сома бойынша тағайындау
-= Айырмашылық бойынша тағайындау
*= Өнім бойынша тағайындау
/= Тапсырма цитата бойынша беріледі
%= Қалғанына қарай тағайындау
<<= Солға ығысу бойынша тапсырма
>>= Оңға ығысу арқылы тапсырма
&= Тағайындау бит және (ЖӘНЕ)
^= Тағайындау бит және (ХОР)
|= Тағайындау бит және (НЕМЕСЕ)
throw Лақтыру операторы (ерекшелік лақтыру, тек C++)
17 , Үтір Солдан оңға қарай

Ескертпелер[өңдеу]

Басымдық кестесі, егер ол жақша ішінде нақты көрсетілмеген болса, тізбектелген өрнектермен байланыстыру тәртібін анықтайды.

  • Мысалыға, ++x*3 кейбір ережелер анық емес. Артықшылық кестесі бізге мынаны айтады: x неғұрлым тығыз байланыстырылған ++ қарағанда * , осылай ++ жасайды (қазір немесе кейінірек - төменде қараңыз), ол тек сол үшін жасалады x (және x*3 емес); ол (++x, x*3) сәйкес келеді.
  • Сол сияқты, 3*x++, қайда болса да, түзетуден кейін ++ бүкіл өрнек бағаланғаннан кейін әрекет ету үшін жасалған, басымдық кестесінде ТЕК КЕШІН анық көрсетілген x (және 3*x емес). Шындығында, өрнек (tmp=x++, 3*tmp) бағаланады 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])++) . WHAT ішкі өрнегі әр оператордың әрекет етуі басымдық кестесінен айқын, бірақ WHEN әр оператордың әрекеті басымдық кестесінде шешілмейтініне назар аудару керек; бұл мысалда, ( . )++ оператор тек әрекет етеді y[i] алдыңғы ережелер бойынша, бірақ міндетті деңгейлер тек постфикс жасау уақытын көрсетпейді ++ ( . )++ оператор y[i] өрнекте бағаланғаннан кейін ғана әрекет етеді).

Көптеген таңбалар тізбегі бар көптеген операторларға әр таңбаның операторлық атауынан құрылған «атаулар» беріледі. Мысалыға, += and -= жиі аталады plus equal(s) және minus equal(s), орнына көбірек «қосымша тағайындау» және «бөлу арқылы тағайындау». С және С ++ тілдеріндегі операторлардың байланысы (сәйкес стандарттарда) алдын-ала берілген кестеден гөрі, факториялық тіл грамматикасымен көрсетілген. Бұл кейбір қателіктерді тудырады. Мысалы, С тілінде шартты өрнектің синтаксисі:

logical-OR-expression ? expression : conditional-expression

C ++ тілінде болғанда:

logical-OR-expression ? expression : assignment-expression

Демек, өрнек:

e = a < d ? a++ : a = d

екі тілде әр түрлі талданған. С-та бұл өрнек синтаксистік қате болып табылады, өйткені С-да тағайындалған өрнек үшін синтаксис:

unary-expression '=' assignment-expression

C ++ тілінде ол келесідей талданды:

e = (a < d ? a++ : (a = d))

Битралдық және теңдік операторларының басымдылығы[өңдеу]

Бітпелі қисынды операторлардың артықшылығы сынға ұшырады. Тұжырымдамалық және & * және + сияқты арифметикалық операторлар.

Тарихи тұрғыдан биттік және логикалық операторлар арасында синтаксистік айырмашылық болған жоқ. BCPL, B және C басында, && операторлары болған жоқ. Оның орнына & Олардың 'шындық мәнмәтінінде' (мысалы, логикалық мән күтілген кезде, мысалы 1 = if (a == b) жағдайында қолданылатындығына байланысты әртүрлі мағынаға ие болды. (& c) {...}ол логикалық оператор ретінде көрінді, бірақ 1 = c = a & b тілінде ол аздап жүреді). Бұл қолданыстағы қондырғылармен кері үйлесімділікті сақтау үшін сақталды.

Сонымен қатар, C ++ (және C нұсқаларының кейінгі нұсқалары) теңдігінің операцияларында, үш жақты салыстыру операторын қоспағанда, тұжырымдамасы бір бит (1 немесе 0) болып табылатын және «биттік бағытта» сәйкес келмейтін логикалық типтің мәндерін береді.

C ++ операторының синонимдері[өңдеу]

C ++ бірқатар операторларға лақап ат ретінде әрекет ету үшін белгілі түйін сөздерді анықтайды:

Түйін сөздер Оператор
and &&
and_eq &=
bitand &
bitor |
compl ~
not !
not_eq !=
or ||
or_eq |=
xor ^
xor_eq ^=

Оларды алмастыратын тыныс белгілері сияқты дәл қолдануға болады, өйткені олар басқа атпен бірдей оператор емес, тиісті оператордың аты (таңба жолы) үшін қарапайым таңбалауыштарды алмастырады. Бұл өрнектердің 1=(a > 0 and not flag) және 1=(a > 0 && !flag) бірдей мағыналары бар. Бұл дегеніміз, мысалы, bitand түйін сөздерді тек ауыстырудың орнына пайдалануға болады bitwise-and оператор, сонымен қатар address-of , ол тіпті анықтамалық типтерді көрсету үшін де қолданыла алады (мысалы 1=int bitand ref = n).

Сондай-ақ[өңдеу]

References[өңдеу]

[1]

[2]

С++ философиясы

[3]