Programmer’s Reference



страница4/19
Дата21.09.2016
Размер2.35 Mb.
#10416
1   2   3   4   5   6   7   8   9   ...   19

ГЛАВА 3 - Оператори

С/С++ имат богато множество от оператори които могат да бъдат разделени в следните класове : аритметични , релационни и логически , побитови , указатели , присвояване , 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 преобразуване на тип

.* ->*

* / %

+ -

<< >>

< <= > >=

== !=

&

^

|

&&

||

?:

= += -= *= /= %= >>= <<= &= ^= |=

Най – нисък ,





Каталог: books
books -> Тайнствената сила на пирамидите Богомил Герасимов Страхът на времето
books -> В обятията на шамбала
books -> Книга се посвещава с благодарност на децата ми. Майка ми и жена ми ме научиха да бъда мъж
books -> Николай Слатински “Надеждата като лабиринт” София, Издателство “виденов & син”, 1993 год
books -> София, Издателство “Българска книжница”, 2004 год. Рецензенти доц д. ик н. Димитър Йончев, проф д-р Нина Дюлгерова Научен редактор проф д-р Петър Иванов
books -> Николай Слатински “Измерения на сигурността” София, Издателство “Парадигма”, 2000 год
books -> Книга 2 щастие и успех предисловие
books -> Превръщане на числа от една бройна система в друга
books -> Тантриското преобразяване


Сподели с приятели:
1   2   3   4   5   6   7   8   9   ...   19




©obuch.info 2024
отнасят до администрацията

    Начална страница