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

Уикипедия — ашық энциклопедиясынан алынған мәлімет
Навигацияға өту Іздеуге өту
                                C және C ++ операторлары

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

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

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

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

Бұл кестеде a, b және c қолданыстағы мәндерді (литеральды мәндер мен айнымалы мәндер немесе қайтару мәні), объектілердің атауларына немесе мәндеріне сәйкес келеді. R, S және T кез-келген типке, ал K класына немесе санамаланған типке арналған.


Арифметикалық операторлар

[өңдеу | қайнарын өңдеу]
Оператордың атауы Синтаксис C ++ тілінде шамадан тыс жүктей алады С құрамына кіреді C++ прототипінің мысалдары
Негізгі оператор a=b Иә Иә R& K::operator =(S b);
Қосу a+b Иә Иә R& K::operator +(S b);
Азайту a-b Иә Иә R& K::operator -(S b);
Unary plus (бүтін санмен жылжыту) +a Иә Иә R K::operator +();
Unary minus (кері қоспа) -a Иә Иә R K::operator -();
Көбейту a*b Иә Иә R& K::operator *(S b);
Бөлу a/b Иә Иә R& K::operator /(S b);
Modulo (бүтін сандарды қалдықсыз бөлу) a%b Иә Иә R& K::operator %(S b);
Қосу ++a(Префикс) Иә Иә R& K::operator ++();
Қосу a++(Постфикс) Иә Иә R& K::operator ++(int);
Азайту --a(Префикс) Иә Иә R& K::operator --();
Азайту a--(Постфикс) Иә Иә R& K::operator --(int);

Салыстыру / байланыс операторлары

[өңдеу | қайнарын өңдеу]
Оператордың атауы Синтаксис C ++ тілінде шамадан тыс жүктей алады С құрамына кіреді C++ прототипінің мысалдары
Тең a==b Иә Иә bool operator ==(K const& a, S const& b);
Тең емес a!=b Иә Иә bool operator !=(K const& a, S const& b);
Үлкен a>b Иә Иә bool operator >(K const& a, S const& b);
Кем a<b Иә Иә bool operator <(K const& a, S const& b);
Үлкен немесе тең a>=b Иә Иә bool operator >=(K const& a, S const& b);
Кем немесе тең a/b Иә Иә bool K::operator <=(S const& b);
Үш жақты салыстыру a%b Иә Жоқ std::weak_equality K::operator <=>(const S &b);

Логикалық операторлар

[өңдеу | қайнарын өңдеу]
Оператордың атауы Синтаксис C ++ тілінде шамадан тыс жүктей алады С құрамына кіреді C++ прототипінің мысалдары
Логикалық теріске шығару (ЕМЕС) ! a Иә Иә R& K::operator =(S b);
Логикалық ЖӘНЕ a && b Иә Иә bool K::operator &&(S b);
Логикалық НЕМЕСЕ a // b Иә Иә bool K::operator (S b);

Биттік операторлар

[өңдеу | қайнарын өңдеу]
Оператордың атауы Синтаксис C ++ тілінде шамадан тыс жүктей алады С құрамына кіреді C++ прототипінің мысалдары
Биттік ЖОҚ ~ a Иә Иә R K::operator ~();
Биттік және a&b Иә Иә R K::operator &(S b);
Биттік НЕМЕСЕ b Иә Иә (S b);
Биттік XOR a^b Иә Иә R K::operator ^(S b);
Биттің солға жылжуы a<<b Иә Иә R K::operator <<(S b);
Биттің оңға жылжуы a>>b Иә Иә R K::operator >>(S b);

Мүше және көрсеткіш операторлары

[өңдеу | қайнарын өңдеу]
Оператордың атауы Синтаксис C ++ тілінде шамадан тыс жүктей алады С құрамына кіреді C++ прототипінің мысалдары
Жолдау a[b] Иә Иә R& K::operator [](S b);
Жанама ( «нысан А атап көрсетті») *a Иә Иә R& K::operator *();
Мекенжай-ның ( «А мекен-жайы») &a Иә Иә R* K::operator &();
Құрылымы разыменовывания ( «объектісінің мүшесі B А атап көрсетті») a->b Иә Иә R* K::operator ->();
Құрылымы анықтама ( «нысан а мүшесі б») a.b Жоқ Иә
Бойынша таңдалған мүше меңзер үшін мүшесі объектінің б а арқылы атап a->*b Иә Жоқ R& K::operator ->*(S b);
Таңдалған нысанды А мүше меңзер үшін мүшесі B a.*b Жоқ Жоқ

Күрделі операторлары

[өңдеу | қайнарын өңдеу]
Оператордың атауы Синтаксис Мағынасы C ++ тілінде шамадан тыс жүктей алады С құрамына кіреді C++ прототипінің мысалдары
Қосу a+=b a=a+b Иә Иә R& K::operator +=(S b);
Азайту a-=b a=a-b Иә Иә R& K::operator -=(S b);
Көбейту a*=b a=a*b Иә Иә R& K::operator *=(S b);
Бөлу a/=b a=a/b Иә Иә R& K::operator /=(S b);
Modulo assignment a%=b a=a%b Иә Иә R& K::operator %=(S b);
Бинттік ЖӘНЕ a&=b a=a&b Иә Иә R& K::operator &=(S b);
Биттік НЕМЕСЕ =b b Иә Иә =(S b);
Биттік XOR a^=b a=a^b Иә Иә R& K::operator ^=(S b);
Биттің солға жылжуы a<<=b a=a<<b Иә Иә R& K::operator <<=(S b);
Биттің оңға жылжуы a>>=b a=a>>b Иә Иә R& K::operator >>=(S b);

==Басқа операторлар==

Оператордың атауы Синтаксис C ++ тілінде шамадан тыс жүктей алады С құрамына кіреді C++ прототипінің мысалдары
Function call(функцияны щақыру) a(a1, a2) Иә Иә R K::operator ()(S a, T b, ...);
Comma(үтір) a,b Иә Иә R K::operator ,(S b);
Ternary conditional (үштік шартты) a?b:c Жоқ Иә
Ауқымдылығы a::b Жоқ Жоқ
Пайдаланушыға анықтама литературалары C++11 бастап "a"_b Иә Жоқ
Sizeof (көлемі) sizeof(a) sizeof(type) Жоқ Иә
Параметр пакетінің мөлшері C++11 бастап sizeof...(Args) Жоқ Жоқ
Alignof C++11 бастап alignof(type) or _Alignpf(type) Жоқ Иә
Түрді сәйкестендіру typeid(a) typeid(type) Жоқ Жоқ
Айырбастау (C стилінде) (type)a Иә Иә K::operator R();
Айырбастау type(a) Жоқ Жоқ R& K::operator >>=(S b);
static_cast айырбастау static_cast<type>(a) Иә Жоқ K::operator R(); explicit K::operator R();
dynamic_cast айырбастау dynamic_cast<type>(a) Жоқ Жоқ
cont_cast айырбастау cont_cast<type>(a) Жоқ Жоқ
reinterpret_cast айырбастау reinterpret_cast<type>(a) Жоқ Жоқ
Қойманы қолдану new type Иә Жоқ void* K::operator new(size_t x);
Қойманы қолдану (array) new type[n] Иә Жоқ void* K::operator new[](size_t a);
Сақтау орнын босату delete a Жоқ Жоқ void K::operator delete(void *a);
Сақтау орнын босату (array) delete[] a Иә Жоқ void K::operator delete[](void *a);
Ерекшеліктерді тексеру бастап C++11 noexcept(a) Иә Жоқ

Оператордың басымдылығы

[өңдеу | қайнарын өңдеу]

Кестедегі келесі тізімдер басымдыққа және қауымдастыққа барлық операторлары C және C ++ тілдерінде (операторлар, сондай-ақ Java, Perl, PHP және басқа да көптеген тілдерде кездеседі, басымдылығы берілгендей болып табылады). Операторлар жоғарыдан төменге қарай кему ретінде тізімделеді. Кему басымдылығы операторлар мен операндаларды топтастырудың басымдылығын білдіреді. Өрнекті ескере отырып, кейбір жолдарда тізімделетін оператор оның астындағы жолда көрсетілген кез келген операторға дейін топтастырылады. Бір ұяшықта орналасқан операторлар (ұяшықта бірнеше оператордың тізімдері болуы мүмкін) берілген бағытта бірдей басымдықпен топтастырылған. Оператордың артықшылығы артық жүктеме әсер етпейді. C және C ++ өрнектерінің синтаксисі сөйлем құрылымының грамматикасымен анықталған. [1] Берілген кесте грамматикадан алынған. ISO C 1999 стандарты үшін 6.5.6 ескертпесінде 71 бөлімінде спецификацияда көрсетілген С грамматикасы С операторларының артықшылығы анықталады, сондай-ақ грамматикадан туындайтын оператордың артықшылығы спецификацияның бөлімін мұқият қадағалайтыны айтылған:

« [C] синтаксисі (яғни, грамматика) өрнекті бағалаудағы операторлардың басымдылығын анықтайды, бұл алдымен осы кіші тармақтың негізгі ішкі тармақтарының тәртібімен бірдей.» [1]

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

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

Мысалы, ++x*3 кейбір ережелерсіз бір мәнді емес. X (қазір немесе төмен кейінірек-қараңыз) жасайды кез келген ++, ол тек Х (емес, оны жасайды сондықтан, * қарағанда ++ көбірек тығыз «байланысты» болып: басымдылығы үстел бізге айтады x*3 ) ; ол ( ++x, x*3 ) -ге тең. Сол сияқты, 3*x++, түзетуден кейінгі ++ барлық өрнек бағаланғаннан кейін әрекет ету үшін жасалған болса да, басымдық кестесінде ҚАЗІР x өсетінін анықтайды (және 3*x ЕМЕС). Шын мәнінде, өрнек ( tmp=x++, 3*tmp ) ТМЗуақытша мән болып табылатын бағаланады. Ол (тәрізді нәрсе үшін функционалды балама болып табылады tmp=3*x, ++x, tmp ).

Басымдылық немесе байланыстыру туралы мәселені шеше отырып, 3 + 2 * y [i] ++ өрнегі үшін жоғарыдағы диаграмманы қарастырыңыз. Компилятордың міндеті диаграмманы өрнек түрінде шешу болып табылады, бұнда бірнеше нотариаттық операторлар (оларды 3+ (.) Деп атаңыз, 2 * (.), (.) ++ және (.) [I]) байланыстыруға тырысады. дейін Басымдық кестесінің реті олардың әрқайсысы әрекет ететін соңғы ішкі өрнекті шешеді: (.) [I] тек y, (.) ++ әрекеттерін тек y [i], 2 * (.) Амалдарында ғана y [бойынша әрекет етеді]. i] ++ және 3+ (.) 2 * ((y [i]) ++) функциясында «тек» әрекет етеді. WHAT ішкі өрнегі әр оператордың әрекет етуі басымдық кестесінен айқын, бірақ WHEN әр оператордың әрекеті басымдық кестесінде шешілмейтініне назар аудару керек; бұл мысалда (.) ++ операторы тек ережелер бойынша y [i] бойынша әрекет етеді, бірақ байланыстыру деңгейлері ++ постиксінің уақыты көрсетілген емес ((.) ++ операторы y [i кейін ғана әрекет етеді). ] өрнегінде бағаланады). Көптеген таңбалар тізбегі бар көптеген операторларға әр таңбаның операторлық атауынан құрылған «атаулар» беріледі. Мысалы, көбінесе « қосу арқылы тағайындау» және «бөлу арқылы тағайындау» орнына += және -= плюс тең (лер) және минус тең (лер) деп аталады. С және С ++ тілдеріндегі операторлардың байланысы (сәйкес Стандарттарда) алдын-ала берілген кестеден гөрі, факториялық тіл грамматикасымен көрсетілген. Бұл кейбір нәзік қақтығыстарды тудырады. Мысалы, С шартты өрнектің синтаксисі: Биттік және теңдік операторларының басымдылығы Биттік басымдылық операторлардың артықшылығы сынға ұшырады. [1] Тұжырымдамалық және & | * және + сияқты арифметикалық операторлар. Өрнек Үлгі:Cpp синтаксистік ретінде талдану Үлгі:Cpp өрнек, ал Үлгі:Cpp ретінде талдану Үлгі:Cpp . Бұл жақшаларды әдеттегіден гөрі жиі қолдануды талап етеді. Тарихи тұрғыдан биттік және логикалық операторлар арасында синтаксистік айырмашылық болған жоқ. BCPL, Bжәне C ерте, Үлгі:Cpp операторлары болған жоқ. Оның орнына Үлгі:Cpp олар «шындық-мән контексте» пайдаланылады ма байланысты әр түрлі мағынасы болды (яғни логикалық мән күтілген болатын, мысалы үшін Үлгі:Cpp}, ол логикалық оператор ретінде өзін, бірақ Үлгі:Cpp ол аздап жүреді). Бұл қолданыстағы қондырғылармен кері үйлесімділікті сақтау үшін сақталды. [1] Сонымен қатар, C ++ (және C нұсқаларының кейінгі нұсқалары) теңдігінің операцияларында, үш жақты салыстыру операторын қоспағанда, тұжырымдамасы бір бит (1 немесе 0) болып табылатын және «биттік бағытта» сәйкес келмейтін логикалық типтің мәндерін береді. «операциялары. C ++ операторының синонимдері C ++ бірқатар негізгі операторларға белгілі бір лақап ат аңықтады: Алмастыратын тыныс белгілерді дәл қолдануға болады, өйткені олар әр түрлі аталса д, тиісті оператордың атына(таңба жолына) қарапайым таңбаларды алмастырады және де олар бірдей оператор болып саналмайды. Бұл өрнектер Үлгі:Code мен Үлгі:Code Үлгі:Code бірдей мағынаға ие екенін білдіреді. Бұл дегеніміз, мысалы, bitandнегізгі сөзі bitand - операторды ғана емес, сонымен қатар оператордың мекен-жайын алмастыру үшін де қолданылуына болады және оны анықтамалық типтерді белгілеу үшін де қолдануға болады (мысалы: Үлгі:Code ). ISO C спецификациясы Үлгі:Code тақырып файлындағы алдын-ала Үлгі:Code ретінде макростар ретінде осы негізгі сөздер үшін мүмкіндік береді. C, C ++ үйлесімділігі үшін жасаған тақырыбы Үлгі:Code, оның енгізілуі ешнәрсеге әсер етпейді. Биттік және теңдік операторларының басымдылығы Биттік басымдылық операторлардың артықшылығы сынға ұшырады. [1] Тұжырымдамалық және & | * және + сияқты арифметикалық операторлар. Өрнек Үлгі:Cpp синтаксистік ретінде талдану Үлгі:Cpp өрнек, ал Үлгі:Cpp ретінде талдану Үлгі:Cpp . Бұл жақшаларды әдеттегіден гөрі жиі қолдануды талап етеді.

Тарихи тұрғыдан биттік және логикалық операторлар арасында синтаксистік айырмашылық болған жоқ. BCPL, Bжәне C ерте, Үлгі:Cpp операторлары болған жоқ. Оның орнына Үлгі:Cpp олар «шындық-мән контексте» пайдаланылады ма байланысты әр түрлі мағынасы болды (яғни логикалық мән күтілген болатын, мысалы үшін Үлгі:Cpp}, ол логикалық оператор ретінде өзін, бірақ Үлгі:Cpp ол аздап жүреді). Бұл қолданыстағы қондырғылармен кері үйлесімділікті сақтау үшін сақталды. [1]

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

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

[өңдеу | қайнарын өңдеу]

C ++ бірқатар негізгі операторларға белгілі бір лақап ат аңықтады:

Негізгі сөз Оператор
and &&
and_eq &=
bitand &
bitor
compl ~
not !
not_eq ! =
or
or_eq =
xor ^
xor_eq ^=

Алмастыратын тыныс белгілерді дәл қолдануға болады, өйткені олар әр түрлі аталса д, тиісті оператордың атына(таңба жолына) қарапайым таңбаларды алмастырады және де олар бірдей оператор болып саналмайды. Бұл өрнектер Үлгі:Code мен Үлгі:Code Үлгі:Code бірдей мағынаға ие екенін білдіреді. Бұл дегеніміз, мысалы, bitandнегізгі сөзі bitand - операторды ғана емес, сонымен қатар оператордың мекен-жайын алмастыру үшін де қолданылуына болады және оны анықтамалық типтерді белгілеу үшін де қолдануға болады (мысалы: Үлгі:Code ). ISO C спецификациясы Үлгі:Code тақырып файлындағы алдын-ала Үлгі:Code ретінде макростар ретінде осы негізгі сөздер үшін мүмкіндік береді. C, C ++ үйлесімділігі үшін жасаған тақырыбы Үлгі:Code, оның енгізілуі ешнәрсеге әсер етпейді.