С/С++ имат богато множество от оператори които могат да бъдат разделени в следните класове : аритметични , релационни и логически , побитови , указатели , присвояване , I/O и различни .
Аритметични оператори
С/С++ има следните седем аритметични оператора :
Оператор Действие
- Изваждане , унарен минус + Събиране
* Умножение
/ Деление
% Целочислено деление
-- Намаляване
++ Увеличаване
Операторите + , - , * и / работят по очаквания начин . Оператора % връща остатъка от целочислено деление . Увеличаващия и намаляващия оператори увелияават или намаляват операнда с единица . Тези оператори имат следния ред на приоритет :
Приоритет Оператори
Най – висок ++ -- - (унарен минус )
* / %
Най – нисък + -
Операторите от еднакво ниво на приоритет се изчисляват отляво надясно.
Релационни и логически оператори
Релационните и логическите оператори се използват за получаване на true / false резултати и са често използвани заедно . В С/С++ всяко ненулево число се изчислява като true .0 е false . В С++ резултата от релационните и логическите оператори е от тип bool . В С , резултата е 0 или ненулево цяло число .Релационните оператори са изброени тук :
Оператор Значение
> По – голямо
>= По – голямо или равно
< По – малко
<= По – малко или равно
== Равно
!= Неравно
Логическите оператори са показани тук :
Оператор Значение
&& AND
|| OR
! NOT
Релационните оператори се използват за сравнение на две стойности . Логическите оператори се използват да свържат две стойности или в случая на ! да обърнат стойноста . Приоритета на тези оператори е показан във следващата таблица :
Приоритет Оператор
Най – висок !
> >= < <=
== !=
&&
Най – нисък ||
Като пример следващия израз if изчислява за true и отпечатва реда x is less than 10 :
X = 9 ;
if ( x < 10 ) cout << “x is less than 10 “;
Обаче в следващия пример , никакво съобшение не се показва понеже двете операнди свързани със && трябва да са true за да е резултата true :
X = 9 ;
Y = 9 ;
if (x < 10 && y > 10 )
cout << “this will not print. “;
Побитови оператори
С и С++ доставят оператори които действат върху действителните битове които съдържа стойноста . Побитовите оператори могат да бъдат използвани само върху целочислени типове . Побитовите оператори са :
Оператор Значение
& AND
| OR
^ XOR
~ Единствено допълнение
>> Преместване надясно
<< Преместване наляво
Оператори & , | и ^
Таблицата за истинност на & , | и ^ е :
p q p&q p|q p^q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
Тези правила се прилагат към всеки бит във всеки операнд когато побитовите AND , OR или XOR се изпълнят . Например пример за побитовa AND операция е показана тук :
0 1 0 0 1 1 0 1
& 0 0 1 1 1 0 1 1
0 0 0 0 1 0 0 1
Побитова OR операция изглежда така :
0 1 0 0 1 1 0 1
| 0 0 1 1 1 0 1 1
0 1 1 1 1 1 1 1
Побитова XOR операция е показана тук :
0 1 0 0 1 1 0 1
^ 0 0 1 1 1 0 1 1
0 1 1 1 0 1 1 0
Оператор за единствено допълнение ~
Oператора ~ ще инвертира всички битове в неговия операнд . Например ако символната променлива ch има следната схема :
0 0 1 1 1 0 0 1
тогава
ch = ~ch ;
поставя битовия шаблон
1 1 0 0 0 1 1 0
в ch .
Преместващите оператори >> и <<
Десния ( >> ) и левия ( << ) преместващи оператори преместват всички битове във целочислена стойност със зададени позиции . Когато битовете се преместват с 1 назад , се прибавя 0 в другия край ( ако стойността която се премества е отрицателна и се изпълни дясно преместване , тогава се поставят 1 отпред за да се запази знзка ) . Числото от дясната страна на преместващия оператор определя броя на преместващите позиции . Общата форма на всеки преместващ оператор е :
стойност >> число
стойност << число
Тук число определя броя на позициите на които се премества стойността . Подавайки битовия шаблон ( и приемайки неозначена стойност ) :
0 0 1 1 1 1 0 1
при преместване надясно се получава :
0 0 0 1 1 1 1 0
а при преместване наляво :
0 1 1 1 1 0 1 0
Програмен съвет
Преместването надясно е в действителност деление на 2 , а наляво е умножение по 2 . За много компютри , преместването е по – бързо от умножението или делението . Ако ви трябва бърз начин да умножите или разделите на 2 , разгледайте употребата на преместващите оператори . Например следващия фрагмент от код първо ще умножи и след това ще раздели стойността в x на 2 :
int x ;
х = x << 1 ;
х = x >> 1;
Разбира се , когато използвате преместващите оператори за да изпълните умножение , трябва да внимавате да не преместите битовете извън края .
Приоритета на побитовите оператори е:
Приоритет Оператор
Най-висок ~
>> <<
&
^
Най-нисък |
Указателни оператори
Двата указателни оператора са * и &. Указател е променлива която съдържа аадреса на друг обект . Или представено различно , променлива която съдържа адреса на друг обект се казва че сочи към този обект .
Указателен оператор &
Оператора & връща адреса на обекта който предхожда . Например , ако цялото число х е разположено в паметта на адрес 1000 тогава
p = & x ;
Поставя стойността 1000 в p. & може да бъде означен като “адреса на “ Например предишния израз може да бъде прочетен като “постави адреса на х във p “
Указателен оператор *
& е индиректен оператор . Той използва текущата стойност на променливата която предхожда като адрес на който данните ще бъдат съхранени или получени . Например фрагмента :
p = &x; /* слага адреса на х във p */
*p = 100; /* използва адреса съдържан от *p */
поставя стойността 100 във х . * може да бъде запомнен като “на адрес” . В този пример втория ред може да бъде прочетен като “постави стойност 100 на адрес р”. Понеже р съдържа адреса на х , стойността 100 е в действителност съхранена в х . Казано в думи р се казва че сочи към х . Оператора * може също да бъде използван в дясната страна на присвояване .Например:
p = &x ;
*p = 100 ;
z = *p/100;
поставя стойността 10 във z .
Оператори за присвояване
В С/С++ присвояващия оператор е единичен знак за равенство . Когато присвоявате обща стойност на няколко променливи , вие можете да ги “вържете заедно “ . Например:
a = b = c = 10;
Присвоява на а , b и с стойноста 10 . С/С++ позволява удобна форма на “късо” присвояване в тази обща форма :
променлива = променлива операция израз ;
Присвоявания от този тип могат да бъдат скъсени към:
променлива операция = израз ;
Например двете присвоявания:
х = x + 10 ;
y = y / z ;
Могат да бъдат пренаписани така :
х + = 10 ;
y / = z ;
Оператора ?
Оператора ? е тернарен оператор ( работи със три операнда ) .Има следната обща форма :
израз1 ? израз 2 : израз 3;
Ако израз1 е true , тогава резултата от операцията е израз2 , в противен случай е стойноста на израз3 .
Програмен съвет
? се използва често да замества if - else условието от този общ вид:
if ( израз1 ) променлива = израз2 ;
else променлива = израз2 ;
Например поредицата
if ( y < 10 ) x = 20 ;
else x = 40 ;
Може да бъде написана така :
x = ( y < 10 ) ? 20 : 40 ;
Тук х присвоява стойност 20 ако у е по – малко от 10 и 40 ако това не е така . Една причина че оператора ? съществува освен спестяването на писане е че компилатора може да произведе много бърз код за това условие - много по- бързо отколкото за подобни if – else изрази .
Оператори за членове
Оператора . и оператора -> (стрелка ) се използват за обръщане към отделните членове на класове , структури и обединения . Оператора точка е приложен към действителния обект . Оператора стрелка се използва със указател към обект . Например подавайки следната структура :
struct date_time {
char date[ 16 ] ;
int time ;
} tm ;
за присвояване на стойноста “3 / 12 / 99 “ на date член от обект tm вие трябва да напишете :
strcpy ( tm.date , “3 / 12 / 99 “ ) ;
Обаче ако p_tm е указател към обект от тип date_time се използва следния израз :
strcpy ( p_tm -> date , “3 / 12 / 99 “ ) ;
Оператора запетайка
Оператора запетайка предизвиква да бъде изпълнена поредица от операции . Стойноста на целия израз със запетайки е стойността на последния израз от списъка . Например след изпълнението на следния фрагмент :
y = 15 ;
x = ( y = y – 5 , 50 / y ) ;
x ще има стойност 5 понеже първоначалната стойност на у от 15 се намалява със 5 и тогава се разделя на 50 получавайки като резултат 5. Можете да смятате оператора запетайка като “направи това и това “.Оператора се използва често във изразите for . Например :
for ( z = 10 , b = 20 ; z < b ; z++ , b --) { // . . .
Тук z и b се инициализират и изменят чрез използване на разделени със запетайки изрази .
sizeof
Въпреки че sizeof е също ключова дума , той е оператор по време на компилация , използван за определяне размера в байтове на променлива или типове данни включително класове , структури и обединения . Ако се използва със тип , името на типа трябва да бъде затворено със кръгли скоби . За повечето 32 – битови компилатори следващия пример отпечатва 4 :
int x ;
cout << sizeof х ;
Преобразуване
Преобразуване е специален оператор който конвертира един тип данни във друг . И С и С++ поддържат тази форма на преобразуване:
( тип ) израз ;
където тип искания тип данни . Например следващото преобразуване предизвиква резултата от целочисленото делене да бъде от тип double:
double d ;
d = ( double ) 10 / 3 ;
Преобразувания в С++
С++ поддържа допълнителни оператори . Това са const_cast , dynamic_cast , reinterpret_cast и static_cast . Техните общи форми са :
const_cast < тип > (обект)
dynamic_cast < тип > (обект)
reinterpret_cast < тип > (обект)
static_cast < тип > (обект)
Тук тип определя целевия тип на преобразуването и обект е обекта който ще бъде преобразуван в новия тип . const_cast оператора се използва изрично да предефинира const и /или volatilе за преобразуване .Целевия тип трябва да бъде еднакъв като изходния тип с изключение на техните const и volatile атрибути . Най – честата употреба на const_cast е да премахва константността . Оператора dynamic_cast изпълнява преобразуване по време на изпълнение ( runtime ) който проверява валидността на преобразуването . Ако преобразуването не може да стане , то пропада и израза се изчислява на 0 . Например имайки два полиморфни класа B и D и D e производен на В , dynamic_cast може винаги да преобразува D* указател във В* указател . dynamic_cast може да преобразува В* указател във D* указател само ако обекта който указва е в действителност D* . Въобще dynamic_cast ще е успешна ако опитаното полиморфно преобразуване е позволено ( тоест ако целевия тип може легално да се добави към типа от обекта който ще се преобразува ) Ако преобразуването не може да стане тогава dynamic_cast се изчислява на 0 . Оператора static_cast изпълнява неполиморфно преобразуване . Например той да преобразува указател към базов клас във указател към производен клас .Той може също да бъде използван за всякакво стандартно превръщане . Никакви runtime проверки не се изпълняват . Оператора reinterpret_cast променя един тип във фундаментално различен тип . Например той може да бъде използван да промени указател във цяло число . reinterpret_cast трябва да бъде за преобразуване на изцяло несъвместими типове указатели . Само const_cast може да преобразува константността . Нито dynamic_cast , static_cast нито reinterpret_cast могат да променят константността на обект .
Оператори за I / O
В С++ , << и >> са предефинирани да изпълняват I /O операции . Когато се използват в израз в който левия оператор е поток , >> е входен оператор ,а << е изходен оператор . В езика С++ >> е наречен екстрактор понеже извлича данни от входния поток . << е наречен вмъкващ понеже той вмъква данни във изходния поток . Общата форма на тези оператори е :
входен поток >> променлива
изходен поток << израз
Например , следващия фрагмент въвежда две целочислени променливи:
int i , j ;
cin >> i >> j ;
Следващия израз показва “This is a test 10 20 “
cout << “This is a test “ << 10 << ‘ ‘ << 4 * 5 ;
I / O операторите не се поддържат от С .
. * и ->* указатели към член функции
С++ позволява да направите специален тип указател който сочи всъщност към член на клас , а не към член на обект . Този вид указател е наречен указател към член . Указателя към член не е еднакъв като нормалния С++ указател . Вместо това указателя към член доставя само отместването в обекта на члена на класа на което този член може да бъде намерен . Понеже член указателите не са истински указатели . и -> оператори не могат да бъдат приложени към тях . За достъп на член от клас със указател към него трябва да използвате специалните указатели към тях . * и - >* . Когато достигате член от обект подаващ обект или псевдоним към обект използвайте .* оператор . Когато достъпвате член подаващ указател към обект използвайте ->* оператор . Указател към член се декларира по тази обща форма :
тип име-на-клас :: * указател ;
Тук тип е базовия тип на члена , име-на-клас е името на класа , и указател е името на указателя към член променливата която се създава . Веднъж създаден , указател може да сочи към всеки член на неговия клас който е от тип тип . Това е къс пример който демонстрира .* оператор . Обърнете специално внимание на начина по който са декларирани членовете указатели :
# include
using namespace std ;
class cl {
public;
cl ( int i ) { val = i ; }
int val ;
int double_val ( ) { return val + val ; }
} ;
int main ( )
{
int cl :: *data ; // указател към int член променливи
int (cl :: *func) ( ) ; // указатал към член функции
cl ob1 (1) , ob (2) ; // създава обекти
data = &cl :: val ; // получава отместването
func = &cl:: double_val ; // получава отместването
cout << “Here are values : “ ;
cout << ob1. *data << “ “ << ob2 . *data << “\ n” ;
cout << “Here they are doubled : “ ;
cout << (ob1. *func ) ( ) << “ “ ;
cout << ( ob2. * func ) ( ) << “ \ n “ ;
return 0 ;
}
Указателите към член не се поддържат от С .
Оператор за определяне област на видимост ::
Оператора за резрешаване на интервал :: определя интервала към който принадлежат членовете . Той има следната обща форма :
име :: име_на_член
Тук име е името на класа или именованото пространство което съдържа члена определен от име_на_член . Казано различно , име определя интервала в който може да бъде открит идентификатора определен от име_на_член . За обръщане към глобален интервал не трябва да определяте име на интервал . Например за обръщане към глобална променлива наречена count която ще бъде скрита от локална променлива count трябва да използвате този израз :
:: count
Оператора за разрешаване на интервал не се поддържа от С .
new и delete
Операторите new и delete са оператори за динамично заделяне в С++ . Те са също ключови думи . Виж глава 5 за детайли . С не поддържа операторите new и delete .
typeid
В С++ оператора typeid връща псевдоним към type_info обект който описва типа на обекта към който е бил приложен typeid . Общата форма на typeid е:
typeid ( обект )
Оператора typeid поддържа идентификация по време на изпълнение (RTTI ) в С++ . Класа type_info дефинира следните public членове :
bool operator == (const type_info &ob ) const;
bool operator != (const type_info &ob ) const;
bool before (const type_info &ob ) const;
const char * name ( ) const ;
Предефинираните == и != са добавени за сравнение на типове . Функцията before ( ) връща true ако извикващия обект е преди обекта използван като параметър в сравнителен ред . (Тази функция е главно за вътрешна употреба. Нейната връщана стойност не прави нищо със наследяването или класовата йерархия ) .Функцията name ( ) връща указател към името на типа . Когато typeid е приложен към указател към базов клас от полиморфичен клас , той автоматично ще върне типа на обекта който указва ( полиморфичен клас е такъв който съдържа най – малко една виртуална функция ) Така typeid може да бъде използван за определяне типа на обекта указван от указателя към базов клас . С не поддържа typeid .
Предефиниране на оператори
В С++ операторите могат да бъдат предефинирани чрез използване на ключовата дума operator ( виж глава 5 ) Предефинирането на оператори не се поддържа от С .
Таблица на приоритетите на операторите
Следващата таблица изброява приоритетите на всички С и С++ оператори . Отбележете че всички оператори с изключение на унарните , присвояващите и ? , се свързват отляво надясно :
Приоритет оператори
Най – висок ( ) [ ] -> :: .
! ~ ++ -- - * & sizeof new delete typeid преобразуване на тип
.* ->*
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= >>= <<= &= ^= |=
Най – нисък ,
Сподели с приятели: |