Uploaded by lordgame239

c++гакириш

advertisement
1-боб. C++ га киришнинг формал бўлмаган кўриниши
1.1. C++ тилидаги оддий дастур
1-Мисол. Экранга Hello, World! сўзларини чоп этадиган классик масалани қараймиз:
//Hello.cpp – дастур файлининг номи
#include<iostream.h>
void main()
{
cout<<“\nHello, World!\n”;
}
Дастур матнинг биринчи сатри – бу ‘//’ белгиси билан бошланиб, чоп қилинмайдиган ‘сатр
охири’ белгилари тугайдиган белгилар орасидаги бир сатрли изоҳдир. Бу ажратувчи белгилар
орасига ихтиёрий белгиларни жойлашиштириш мумкин. Мазкур мисолдаги изоҳда берилган дастур
матни сақланаётган Hello.cpp файл номи кўрсатилмоқда.
Дастур матнинг иккинчи сатрида дастурдаги маълумотларнинг киритиш ва чиқаришнинг
стандарт оқимларини боғлайдиган препроцессор бўйруқлари (директиваси) келтирилган.
Кўрсатилган воситалар iostream.h файлида жойлашган (“i”(input): - кириш; “o”(output) –
чиқариш; stream – оқим; “h”(head ) – сарлавҳа). Жимлик қоидаси бўйича стандарт чиқариш
оқими экранга чиқаришни билдиради. Стандарт киритиш оқими эса клавиатурадан маълумотларни
ўқишни таъминлайди. Учинчи сатр main номли функция сарлавҳаси ҳисобланади. C++ тилидаги
ихтиёрий бажарилувчи дастурларда бу номли функция фақат ва фақат бир марта учраши керак. main
номидан олдин келган махсус сўз void – мазкур дастурдаги main функцияси ҳеч қандай қиймат
қайтармаслигини билдирувчи турни англатади. main дан кейинги айлана қавслар ихтиёрий функция
сарлавҳаси синтаксисига мос келишини талаб этади. Унда параметрлар рўйхати жойлашади. Бизнинг
мисолда параметрлар йўқ ва рўйхат бўш.
Ихтиёрий функциянинг танаси – бу фигурали қавсга олинган тавсифлар, аниқланиш ва
операторлар кетма-кетлигидан ташкил топади. Ҳар бир тавсифлар, аниқлашлар ёки операторлар
“нуқта вергул” билан тугаши керак. main функциясининг танасида аниқ тавсифлар ва аниқлашлар
йўқ ва у битта оператордан иборат
cout<<“\nHello, World!\n”;
cout iostream.h файлининг оқими бўлиб, маълумотларни экранга чиқаришни
таъминлайдиган объект номи ҳисобланади (чиқаришнинг стандарт оқими). cout объектига
маълумотларни чиқариш учун << амали (“жойлашириш”) ёрдамида ўзатилади. Чиқарилиши керак
маълумотлар << амалидан ўнг томонга жойлашиши керак. Ҳозирги вақтда бу “\nHello,
World!\n” сатридир (сатрли ўзгармас). C++ тилидаги сатр қўш тирноққа олинган ихтиёрий белги
кетма-кетлиги каби аниқланади. Уларнинг орасида экранга чиқарилмайдиган бошқарувчи белгилар
ҳам бўлиши мумкин. Масалан, ‘\n’ – бошқарувчи белигиси кейинги сатр янги сатрдан чиқарилишини
таъминлайди. Яъни, дастур Hello, World!ни янги сатрдан чиқаради ва курсорни кейинги сатр
бошига ўтказади.
Ҳозирда шуни эътироф қилиш керакк, C++ тилининг асосий хусусиятларидан бири қўшимча
(юклама) ёки стандарт амаллар ҳаракатининг номланишидир. << лексемаси фақат шу ҳолатда қўйиш
амали («жойлаштириш») бўладики, агар ундан чап томонда cout объектининг номи жойлашган
бўлса. Қолган ҳолларда << белгилар жуфтлиги чапга силжитиш бинар амалини билдиради. Демак,
бу дастурнинг ягона амалида чиқиш оқими cout қиймати ўрнатиш амалидан фойданилган, яъни
ўнгдан << лексеми жойлаштирилган.
Дастурни бажартириш учун унинг матнини .cpp кенгайтмали файлда тайёрлаш керак; бу
файлни компиляцияга жўнатиш ва компиляция вақтида ҳосил бўлган синтаксис хатоларни тўзатиш;
хатосиз компиляция (.obj кенгайтмали объектли файл ҳосил бўлади); керакли кутубхона
функцияларни объектли файлга қўшиш ва .exe кенгайтмали бажарилувчи дастур модулини олиш.
Бажарилувчи файлни ҳосил қилиш схемаси 1-расмда кўрсатилган, компилятор қадамидан олдин
припроцессор дастур матнини қайта ишлаш қадами кўрсатилган. Бизнинг мисолда припроцессор
#include <iostream.h> директивасини қайта ишлашга ва дастур матнига дицплей билан алмаштириш
воситаси учун боғлайди (<< амалини сақлаб туриш учун).
Агар дастурнинг дастлабки матни HELLO.CPP файлида тайёрланган бўлса, унда
припроцессор унинг директиваси бажариб тўлиқ дастур матни шакллантиради, компилятор
1
HELLO.OBJ объектли файлини яратади, унда кўрсатилган номи танланади (жимлик қоидасига
асосан), компоновшик эса (Linker алоқа редактори) дастурни кутубхона функциялари билан
тўлдирилади, масалан, cout объекти билан ишлаганда, HELLO.EXE файлини ишга туширганда,
экранда кутилган Hello, World! фразасини кўрамиз.
name.cpp
*.cpp
Дастурнинг берилган
матни
Directory (Ишчи каталог)
Include directory
Қўшиладиган
файллар
Препроцессор
name.cpp
*.cpp
Дастурнинг тўлиқ
матни
Компилятор
(Compiler)
name.obj
*.obj
Дастурнинг объектли
коди
Output directory
Library directory
Компоновщик
(Linker)
*.exe
Кутубхона
функциялари
Бажарилувчи
дастур
1-расм. Бажарилувчи дастурни тайёрлаш схемаси
Юқорида кўрсатилган ҳаракатларнинг бажарилиш хусусиятлари C++ аниқ компилятори ва
дастур ишлаётган операцион тизимга боғлиқ. Техник тавсилотларни аниқ дастур маҳсулоти
ҳужжатларидан ўрганиш керак.
2-боб. C++ тилининг асосий лексемаси
2.1. Дастур, лексема ва алфавит ҳақида умумий маълумотлар
Дастурларнинг қайта ишлашнинг умумий схемаси ва бўш жойли ажратувчилар. C++
тилидаги дастур бирлигини асоси – бу <ном>.CPP билан номланган матнли файлдир, бу ерда CPP C++ даги дастур учун қабул қилинган кенгайтма, ном эса кераклича ихтиёрий танланади.
Дастурларни ташқи исмлари билан биргаликда юбориш ва таққослаш қулай бўлиши учун ҳар бир
дастурнинг матни бошида файл номи билан изоҳ қатори киритилиши мақсадга муофиқ. Бу иш
олдинги бобдаги дастурда қилинган. Матнли файл дастурлари билан C++ га аввал
препроцессорларни (1-расмга қаранг) қайта ишлайди, яъни препроцессор (ҳар бир бундай бўйруқлар
‘#’ белгиси билан бошланади) буйруғини (директивалар) танийди ва уларни бажаради. Юқоридаги
дастурда препроцессор бўйруғидан фойдаланганлиги келтирилган
#include<iostream.h>
Препроцессор директивалари бажарилишида, препроцессор дастурнинг берилган матнини
ўзгартиради. #include бўйруғи қўшиладиган файлдан олдиндан тайёрланган матнни дастурга
қуяди. Бундай ҳолатда ўзгартирилган дастур матни компиляция қилишга киритилади. Компилятор
биринчидан, унга тушаётган дастур матнида лексик элементларни, яъни лексималарни ажратиб
2
олади, кейин тил грамматикаси асосида шу лексималардан тузилган маъновий конструкциясини
аниқлайди (ифода, аниқлаш, ёзиш, операторлар ва бошқалар). Компилятор иши фазаларини бу ерда
қараш керак эмас. Фақат шуни таъкидлаш керакки, компилятор ишининг натижасида дастурнинг
объектли модули ҳосил бўлади.
Компилятор C++ тилида дастур матнини лексик таҳлил қилишни бажаради, яъни алоҳида
лексим бўлувчиларини бошланиш ва тамомланиш бўлишини аниқлайди. Бўш жойли ажратувчиларга
бўш жой белгисининг ўзи, табуляция белгиси, янги сатрга ўтказиш белгилари киради. Бундан
ташқари бўш жойли ажратувчиларга изоҳлар ҳам киради.
C++ тилида изоҳларни беришнинг икки усули бор. Оддий (традицион) усулда (ведущий свое
происхождение от многих предшествующих языков, масалан, ПЛ/1, ) чапдан /* белгилар жуфтлиги,
ўнгдан эса */ белгилар жуфтликларга олинган белгилар кетма-кетлиги изоҳни аниқлайди. Бу қўш
белгилар орасига ихтиёрий матнни жойлаштириш мумкин, яъни C++ тилининг алифбосидаги
белгилар ташқари белгиларни (масалан, рус ҳарфлари):
/*Ҳам C++, ҳам C да ишлатиладиган изоҳ*/
Иккинчи усули (C++ га кирган) // белгилар билан бошланган ва янги сатрга ўтиш белгиси
охирини белгиловчи белгилар кетма-кетлиги изоҳни аниқлайди. Бундай бир сатрли изоҳ қўйидаги
кўринишга эга:
//Бу C++ тилидаги бир сатрли изоҳ
C++ тилининг алфавити ва лексемалари. C++ тилининг алфавитига қуйидагилар киради:
 Лотин алифбосининг бош ва кичик ҳарфлари;
 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 рақамлар;
 Махсус белгилар:“ { } , | [ ] ( ) + - / % \ ; ‘ : ? < = > _ ! @ # ` ^ . *
Тилнинг лексемаси алфавит белгиларидан ташкил топади:
 Идентификаторлар;
 Калитли (ҳизматчи, ҳеч бўлмаганда белгиланган) сўзлар;
 Ўзгармаслар;
 Амал белгилари;
 Ажратувчилар (пунктация) белгилари.
Тилнинг бу лексек элементларини тўлиқ қараймиз:
2.2. Идентификаторлар ва ҳизматчи сўзлар
Идентификатор – ҳарф билан бошланувчи лотин алфавити ҳарфлар, ўнлик рақамлар ва _
белгиларидан ташкил топган кетма-кетликдир.
RUN run hard_RAM_disk copy_54
Бош ва кичик ҳарфлар фарқланади. Шунинг учун, бу мисолдаги биринчи иккита
идентификаторлар бир хил. Идентификаторларнинг фарқланадиган қисми аниқ чегараланган. Borland
фирмасининг компилятори биринчи 32 таси фарқ қилинади. Баъзи бир VAX туридаги ЭҲМ да C++
идентификатор узунлиги 8 белгидан ошмайди.
Калитли (хизматчи) сўзлар – бу махсус фойдаланиш учун тилдаги белгиланган
идентификаторлар. C++ нинг калитли сўзлари:
asm
delete
if
return
try
auto
do
inline
short
typedef
break
double
int
signed
typeid
case
else
long
sizeof
union
catch
enum
new
static
unsigned
char
extern
operator
struct
virtual
class
float
private
switch
void
const
for
protected
template
volatile
continue friend
public
this
while
default
goto
register
throw
Олдин C++ тилида overload идентификатори калит сўз сифатида белгиланган эди. Borland
фирмасининг компилятори учун (BC++ ва TC++) қўшимча калит сўзлар киритилади:
cdecl
_export
interrupt
pascal
_seg
_cs
far
_loadds
_regparam
_ss
_ds
huge
near
_saveregs
Регистрли ўзгарувчилар хизматчи сўзлар каби киритилган:
3
_AH
_BH
_CH
_DH
_SI
_SP
_SS
_AL
_BL
_CL
_DL
_DI
_CS
_ES
_AX
_BX
_CX
_DX
_BP
_DS
_FLAGS
Шуни айтиш керакки, BC++ ва TC++ ларнинг олдинги версиясияларида try, throw,
typeid, catch идентикаторлари калит сўзлар сифатида қўшилмаганди.
Юқорида санаб ўтилган хизматчи сўзларни ҳаммаси ҳам бирданига дастурчига керак
бўлмайди, лекин уларни хоҳлаган усулда танлаб олиш тақиқланади ва хизматчи сўзларнинг рўйхати
C++ билан танишишни бошланғич даврида керак. Бундан ташқари идентификаторлар ўзида иккита
кетма-кет белгини белгиловчи (_) C++ ни реализация қилиш учун резервда бўлади ва стандарт
кутубхонани ўз ичига олади. (_) белги билан бошланувган идентификаторлар C++ тилининг
реализация қилинишида фойданилади. Шунинг учун танланган идентификаторлардан фойдаланишни
бошлаганда ост чизиқ белгиси билан бирин-кетин келган иккита белгини бирданига ишлатиш
мумкин эмас.
2.3. Ўзгармаслар
Ўзгармас (литерал) – бу сонли, старли ёки белгили (литерал) қийматларни фиксирланган
кўринишда тасвирлайдиган лексемадир.
Ўзгармаслар беш гуруҳга бўлинади: бутун, ҳақиқий (нуқтаси қўзғалувчан), саноқли, белгили
(литерли) ва сатрли (сатрлар ёки литрли сатрлар). C++ стандарт лойиҳасида саналган ўзгармаслар
бутун сондаги турларнинг бирига мансуб бўлади.
Компилятор лексим тариқасида ўзгармасни ажратиб уни у ёки бу гуруҳга киритади, группа
ичида эса берилган матндаги сонли қийматига кўра унинг “ташқи кўриниши”га қараб (ёзиш
формасига) у ёки бу турга бўлади.
Бутун ўзгармаслар ўнлик, саккизлик ва ўн олтилик саноқ системасида бўлиши мумкин.
Ўнлик саноқ системасидаги бутун ўзгармаслар, агар у нол сони бўлмаса, нол билан
бошланмайдиган ўнлик рақамлар кетма-кетлиги сифатида аниқланади: 16, 484216, 0, 4. Рухсат
этилган мусбат қийматларнинг оралиғи TC++ ва BC++ лар учун 0 дан 4294967295 гача.
Кўрсатилган максимал қийматдан ошиб кетган ўзгармаслар, компиляция босқичида хатолик олиб
келади. Манфий ўзгармаслар – бу белгисиз ўзгармаслар, яъни уларга белгини ўзгартирувчи амал
қўлланилган. TC++ ва BC++ лар учун ўнлик саноқ системасидаги манфий ўзгармасларнинг абсолют
қийматлари 214783648 дан ошиб кетмасилиги керак.
2.1. Жадвал
Бутун ўзгармаслар ва улар учун танланган турлар
Ўзгармас қийматлар оралиғи
Маълумотлар
тури
Ўнлик с.сис.да
Саккизлик с.сис.да Ўн олтилик с. сис.да
0х0000 дан
0 дан 32767 гача
00 дан 077777 гача
int
0х7FFF гача
0100000 дан
0х8000 дан
unsigned
177777 гача
0хFFFF гача
int
32768 дан
0200000 дан
0х10000 дан
long
2147483647 гача
017777777777 гача
0х7FFFFFFF гача
2147483648 дан
020000000000 дан
0х80000000 дан
unsigned
4294967295 гача
037777777777 гача
0х7FFFFFFFF гача
long
>4294967295
>037777777777
>0х7FFFFFFFF
ҳато
Саккизлик саноқ системасидаги бутун ўзгармаслар ҳар доим ноль билан бошланади: 016
ўнлик саноқ системасидага 14 қийматни билдиради. Агар саккизлик саноқ системасидаги
ўзгармасларда рухсат этилмаган 8 ва 9 рақамлари учраса, у ҳолда бу ҳато каби қабул қилинади.
Рухсат этилган саккизлик саноқ системасидаги ўзгармаслар учун мусбат қийматларининг оралиғи
TC++ ва BC++ лар учун 00 дан 037777777777 гача. Саккизлик саноқ системасидаги манфий
ўзгармаслар учун абсолют қиймат 020000000000 дан ошиб кетмаслиги керак.
0х билан бошланадиган ўзгармаслар ўн олтилик саноқ системасидаги ўзгармас ҳисобланади.
Ўн олтилик саноқ системаси рақамларига ўнлик рақамлардан ташқари лотин алифбосидаги a (ёки A)
дан f (ёки F) гача бўлган ҳарфлар ҳам киради. Шунинг учун, 0х16 ўнликдаги 22, 0хF эса –
ўнликдаги 15 қийматларни билдиради. Рухсат этилган ўн олтилик саноқ системасидаги ўзгармаслар
учун мусбат қийматларининг оралиғи TC++ ва BC++ лар учун 0х0 дан 0х7FFFFFFFF гача. Ўн
4
олтилик саноқ системасидаги манфий ўзгармаслар учун абсолют қиймат 0х80000000 дан ошиб
кетмасилиги керак.
Ўзгармаслар қийматига қараб компилятор ЭҲМ хотирасида уларни ҳар хил тасвирлайди.
ЭҲМ хотирасидаги маълумотлар шакллари маълумотлар тури термини билан аталади. Шунга биноан
яхлит ўзгармас ва компилятор автоматик равишда танлаган маълумот турлари 2.1 – жадвалда акс
эттирилган, C тилининг ANSI талабларини қониқтиради, яъни IBM PC/XT/AT оиласига мансуб
компилятор учун ички тасвирлар киритилган.
Агарда дастурчини қандайдир сабаблар туфайли компилятор ёзган ўзгармасда ёзилган тур
қониқтирмаса, унда у аниқ унинг танланганига таъсир қилиш мумкин. Бунинг учун L, l (long) ва
U, u (unsigned) суффикслари хизмат қилади. Масалан, 64L ўзгармас long турига эга бўлади,
гарчан 64 қиймати int турига тегишли бўлса ҳам, бу 2.1 – жадвалидан кўриниб турибди. Битта
ўзгармас учун иккита суффиксдан ихтиёрий тартибда фойдаланиш мумкин. Масалан, 0x22Ul,
0x11Lu, 0x330000UL, 0x55lu ўзгармаслар unsigned long турига тегишли бўлади. Бир
суффиксдан фойдаланилганда, берилган турларнинг танланиши жимлик қоидаси бўйича танланган
турларга тўғри келади. (т.е. без суффикса в соответствии с табл. 2.1. Масалан, 04U long туридаги
ўзгармас, 04U unsigned int турига тегишли ва ҳ.к.).
Компиляция босқичида ўзгармаснинг абсолют қиймати ва унинг L, U суффикслари тасвирини
берилган маълумотлар турларига таъсирини қуйидаги дастурда келтирамиз:
//P2-01.CPP – дастур матни сақланаётган файл номи
#include <iostream.h>
void main() {
cout<<“\n sizeof 111 = ”<<sizeof 111;
cout<<“\n sizeof 111u = ”<<sizeof 111u;
cout<<“\n sizeof 111L = ”<<sizeof 111L;
cout<<“\n sizeof 111ul = ”<<sizeof 111ul;
cout<<“\n\t sizeof 40000 = ”<<sizeof 40000;
cout<<“\n\t sizeof 40000u = ”<<sizeof 4000u;
cout<<“\n\t sizeof 40000L = ”<<sizeof 4000L;
cout<<“\n\t sizeof 40000LU = ”<<sizeof 4000LU;
}
Бу ерда C++ тилининг sizeof унар амалидан фойданилаяпти, яъни операнд ўнг тарафида
ажралиб турган учун хотира ҳажмни байтларда аниқлайди.
Дастур бажарилиши натижаси:
sizeof 111 = 2
sizeof 111u = 2
sizeof 111L = 4
sizeof 111ul = 4
sizeof 40000 = 4
sizeof 40000u = 2
sizeof 40000L = 4
sizeof 40000LU = 4
unsigned int туридаги ўнлик ўзгармаснинг 40000u узунлигига эътиборни қаратиш
керак. Жимлик қоидаси бўйича (2.1 жад. қар.) бундай тур ўнлик ўзгармасга ёзилмайди.
Ҳақиқий ўзгармаслар, яъни қузғалувчан нуқтали ўзгармаслар, ҳатто бутун ўзгармаслардан
қиймати бўйича фарқ қилмайди, ЭҲМ да ички тасвирланиши бошқача формада бўлади. Бу форма
Эта форма требуется использования арифметики с плавающей точкой при операциях с такими
константами. Шунинг учун компилятор ҳақиқий ўзгармасларни таниши керак. Компилятор уларни
ташқи белгилари асосида танийди. Нуқтаси қўзғалувчан ўзгармас қуйидаги олти қисмдан иборат
бўлиши мумкин: бутун қисм (ўнлик бутун ўзгарувчи); ўнлик нуқта; каср қисми (ўнлик бутун
ўзгарувчи); e ва E экспоненталар аломати (белгиси); ўнли даражада кўрсаткичи (ўнлик бутун
ўзгарувчи, вожможно со знаком); F (ёки f) ёки L (ёки l) суффикс.
Ҳақиқий ўзгармасларни ёзишда бутун ёки каср қисмларни (фақат бир вақтда эмас); ўнлик
нуқта ёки даража кўрсаткичли экспонента белгиларини (фақат бир вақтда эмас); суффиксларни
ташлаб кетиш мумкин. Масалан:
5
66.
.0
.12
3.14159
1.12e-2
2E+6L2.71
При отсутствии суффиксов F(f) или L(l) вещественные константы имеют форму внутреннего
представления, которой в языке C++ соответствует тип данных double. F ёки f суффиксларни қўшиш
ўзгармасларни float турига ўтказади. Агар ўзгармасларни тасвирлашда L ёки l суффикслар
ишлатилса, улар long double турига тегишли бўлади. Диапазоны возможных значений и длины
внутреннего представления (размерах в битах) данных вещественного типа показаны в таб. 2.2.
2.2 –Жадвал
Ҳақиқий турдаги маълумотлар
Маълумотлар тури
Ўлчами, битда
Қийматлар оралиғи
Float
32
3.4E-38 дан 3.4E+38 гача
Double
64
1.7E-308 дан 1.7E+308 гача
long double
80
3.4E-4932 дан 1.1E+4932 гача
Следующая программа показывает, какие участки памяти выделяется вещественным
константам разного типа в реализациях TC++ и BC++.
//P2-02.CPP – ҳақиқий сонлар учун хотира ҳажми
#include <iostream.h>
void main() {
cout<<“\n sizeof 3.141592653589793 = ”<<sizeof 3.141592653589793;
cout<<“\n sizeof 3.14159 = ”<<sizeof 3.14159;
cout<<“\n sizeof 3.14159f = ”<<sizeof 3.14159f;
cout<<“\n sizeof 3.14159L = ”<<sizeof 3.14159L;
}
Дастур бажарилиши натижасида – ҳақиқий ўзгармаслар учун белгиланган хотира соҳасининг
байтлардаги ҳажми:
sizeof 3.141592653589793 = 8
sizeof 3.14159 = 8
sizeof 3.14159f = 4
sizeof 3.14159L = 10
Саноқли ўзгармаслар (или константы перечисления, иначе константы перечислимого типа)
enum хизматчи сўзи орқали берилади. По существу это обычные целочисленные константы (int
туридаги), которым приписаны уникальные и удобные для использования обозначения. В качестве
обозначений выбираются произвольные идентификаторы, не совпадающие со служебными словами
и именами других объектов программы. Обозначения присваиваются константам с помощью
определения, например, такого вида:
enum {one=1, two=2, three=3};
Бу ерда enum – “саналган” маълумотлар турини аниқловчи хизматчи сўз. one, two, three
– 1, 2, 3 ўзгармас маъноси учун дастурчи киритган шартли ном. Бундай тавсифдан сўнг дастурда 2
ўзгармаснинг (и наряду с ней) ўрнига унинг маъноси two ни ҳам ишлатиш мумкин ва ҳ.к.
Агар саналган ўзгармасларни тавсифлашда “=” белгиси қатнашмаса ва сонли қиймат
кўрсатилмаса, у ҳолда улар идентификаторга (номга) жимлик қоидаси бўйича ёзилади. Шунинг учун
фигурали қавснинг энг чап томонда турган идентификатор 0 қийматни олади, кейинги ҳар бирининг
қиймати 1 бирликки ошади. Масалан, тавсифга мос равишда
enum {zero, one, two, three};
саналган ўзгармаслар қуйидаги қийматларни қабул қилади:
zero==0, one==1, two==2, three==3
Правило о последовательном увеличении на 1 значений перечислимых констант действует и в
том случае, когда первым из них (слева в списке) явно присвоены значения. Масалан, тавсифлашда
enum {ten=10, three=3, four, five, six};
қуйидаги ўзгармаслар киритилади:
ten==10, three==3, four==4, five==5, six==6
Саналган ўзгармаслар номи уникал бўлиши керак, лекин бу ўзгармас қийматларига боғлиқ
эмас. Турли ҳил ўзгармаслар битта қийматга эга бўлиши мумкин. Масалан, тавсифлашда
enum {zero, nought=0, one, two, paiz=2, three};
қуйидаги ўзгармаслар киритилади:
zero==0, nought==0, one==1, two==2, paiz==2, three==3
6
Значения, принимаемые перечислимыми константами, могут быть заданы не только в виде
целочисленных констант, но и в виде выражений. Масалан,
enum {two=2, four=two*2};
аниқланган ўзгармаслар
two==2 ва four==4
Худди шундай манфий бутун ўзгармас – это константа без знака, к которой применена
унарная операция “-” (минус), то перечислимые константы могут иметь и отрицательные значения.
Для перечислимых констант может быть введено имя типа, соответствующего приведенному
списку констант. Имя типа – это произвольно выбираемый уникальный идентификатор, помещаемый
между служебным словом enum и открывающейся фигурной скобкой ‘{’. Например, определение
enum week{sunday, monday, tuesday, wednesday, thursday, friday,
saturday);
не только определяет константы sunday==0, monday==1, …, но и вводит перечислимый тип с
именем , который может в дальнейшем использоваться в определениях и описаниях других объектов.
Белгили (литерал) ўзгармаслар – бу апсотрифга олинган битта ёки иккита белгидир. Бир
белгили ўзгармас char турига тегишли бўлади. Для представления их значений могут вводиться
переменные символьного типа, т.е. типа char. Ўзгармасларга мисоллар: ‘z’, ‘*’, ‘\012’, ‘\0’, ‘\n’ – бир
белгили ўзгармаслар. ‘db’, ‘\x07\x07’, ‘\n\t’ - икки белгили ўзгармаслар. В этих примерах
заслуживают внимания последовательности, начинающиеся со знака ‘\’. Символ обратной косой
черты ‘\’ используются, во-первых, при записи кодов, не имеющих графического изображения, и, вовторых, символов апостроф (‘), обратная косая черта (\), знак вопроса (?) и кавычки (‘‘). Кроме того,
обратная косая черта позволяет вводить символьные константы, явно задавая их коды в
восьмеричном или шестнадцатеричном виде. ‘\’ белгиси билан бошланувчи литерли кетма-кетлик
эскейп-кетма-кетлик деб номланади. 2.3-жадвалда мумкин бўлган қийматлар келтирилган.
В табл. 2.3 000 – строка от 1 до 3 восьмеричнқх цифр; hh – строка из 1 или 2
шестнадцатеричнқх цифр. Саккизлик саноқ системасидаги сатр 0 дан 377 оралиқдаги ихтиёрий
саккизлик саноқ системаси сонларидан ташкил топиши мумкин. Бу юқори қийматдан ошиб кетса
хатоликка олиб келади. Наиболее часто в программах используется последовательность ‘\0’,
обозначающая пустую (null) литеру. В эскейп-последовательности вслед за \х может быть
записано любое количество шестнадцатеричных цифр. Таким образом, допустимы, например,
константа \х0004F и ее аналог \х4F. Бу қийматдан ошиб кетса компиляция вақтида хато бўлади.
Если непосредственно за символом ‘\’ поместить символ, не предусмотренный таблицей 2.3, то
результат будет неопределенным. Агар саккизлик рақамлар \000 кетма-кетлиги ёки ўн олтилик
\xhh кетма-кетликда рухсат этилмаган белги учраса, у ҳолда бу считается концом восьмеричного
или соответственно шестнадцатеричного кода.
2.3-жадвал
C++ тилида рухсат этилган ESC-кетма-кетликларлари
Ички
Белги маъноси
Тасвири
Реакция или смысл
код
(номланиши)
\a
0x07
bel (audible bell)
Овозли сигнал
\b
0x08
bs (backspace)
Возврат на шаг (забой)
\f
0x0C
ff (form feed)
Перевод страницы (формата)
\n
0x0A
lf (line feed)
Перевод строки (новая строка)
\r
0x0D
cr (carriage return)
Возврат каретки
\t
0x09
ht (horizontal tab)
Горизантал табуляция
\v
0x0B
vt (vertical tab)
Вертикал табуляция
\\
0x5C
\ (backslash)
Тескари слэш
\’
0x27
‘ (single quote)
Апостроф (битталик тирноқ)
\”
0x22
“ (double quote)
Қўш тирноқ
\?
0x3F
? (question mark)
Сўроқ белгиси
\000
000
Ихтиёрий (octal number) Белгининг саккизлик коди
\xhh
0xhh
Ихтиёрий (hex number)
Белгининг ўн олтилик коди
7
Для использования внутренних кодов символов при работе, например, с экраном дисплея
нужна таблица, в которой каждому изображаемому на экране символу соответствует числовое
значение его кода в десятичном, восьмеричном, шестнадцатеричном представлении. На IBM –
совместимых ПЭВМ применяется таблица кодов ASCII. Выбирая из кодовой таблицы подходящее
значение, можно (если это полезно по каким-либо причинам) изпользовать их в программе вместо
явных изображений символов. Масалан:
//P2-03.CPP – белгили ўзгармасларнинг кодларидан фойдаланиш
#include <iostream.h>
void main () {
cout<<‘\x0A’<<‘\x48’<<‘\x65’<<‘\x6C’<<‘\x6C’<<‘\x6F’<<‘\x2C’;
cout<<‘\40’<<‘\127’<<‘\157’<<‘\162’<<‘\154’<<‘\144’<<‘\41’;
}
Дастур экраннинг янги сатрига қуйидагини чиқаради:
Hello, World!
Биринчи чиқариш операторида белгиларнинг ўн олтилик, иккинчида эса саккизлик саноқ
системасидаги кодларидан фойдаланилган: ‘\x0A’ - ‘\n’; ‘\x48’ - ‘H’;…; ‘\40’-‘бўш
жой’; ‘\127’-‘W’;…; ‘\41’-‘!’.
Белгили ўзгармасларнинг қиймати унинг ички кодининг сонли қиймати ҳисобланади. Айтиб
ўтганимиздек, C++ тилидаги бир белгили ўзгармаслар char турига тегишли бўлади ва хотирадан 1
байт жойни эгаллайди. Двухсимвольные константы вида ‘\t\n’ или ‘\r\07’ представляются
двухбайтовыми значениями типа int, причем первый символ (мисолдаги ‘\t’ ёки ‘\r’) размещается в
младшем байте (с меньшим адресом), а второй (мисолдаги ‘\n’ ёки ‘\07’) – в старшем байте.
Санаб ўтилган келишувлар қуйидаги дастурда намойиш этилган:
//P2-04.CPP – длины внутренних представлений символьных констант
#include <iostream.h>
void main () {
cout<<“\n Белгили (литерли) ўзгармасларнинг узунлиги (байтда):”;
cout<<“\nsizeof\‘z\‘ = ”<<sizeof ‘z’;
cout<<“\nsizeof\‘\\n\‘ = ”<<sizeof ‘\n’;
cout<<“\nsizeof\‘\\n\\t\‘ = ”<<sizeof ‘\n\t’;
cout<<“\nsizeof\‘\\x07\\x07\‘ = ”<<sizeof ‘\x07\x07’;
cout<<“\nsizeof\‘\\x0004F\‘ = ”<<sizeof ‘\x0004F’;
cout<<“\nsizeof\‘\\x4F\‘ = ”<<sizeof ‘\x4F’;
cout<<“\nsizeof\‘\\111\‘ = ”<<sizeof ‘\111’;
cout<<“\n\‘\\x0004F\‘ белги кодининг’;
cout<<“ўнлик қиймати = ”<<(int) ‘\x0004F’;
cout<<“\n\‘\\x4F\‘ белги кодининг ўнлик қиймати = ”<<(int) ‘\x4F’;
cout<<“\nБўш жой кодининг ўнлик қиймати = ”<<(int) ‘ ’;
}
Дастур бажарилиши натижасида экранга қуйидагилар чиқарилади:
Белгили (литерли) ўзгармасларнинг узунлиги (байтда):
sizeof‘z‘ = 1
sizeof‘\n‘ = 1
sizeof‘\n\t‘ =2;
sizeof‘\x07\x07‘ = 2
sizeof‘\x0004F‘ = 1
sizeof‘\x4F‘ = 1
sizeof‘\111‘ = 1;
‘\x0004F‘ белги кодининг ўнлик қиймати = 79
‘\x4F‘ белги кодининг ўнлик қиймати = 79
Бўш жой кодининг ўнлик қиймати = 32
Сатр ёки сатрли ўзгармас, кўпинча литерли сатр деб юритилади, қўш тирноққа (апострофга
эмас) олинган белгилар кетма-кетлиги каби аниқланади:
“Бу сатр, сатрли ўзгармас деб ҳам номланади”
8
Говория о стоках, иногда используют термины “строковый литерал”, “стринговый литерал”,
«стринговая константа», «стринг», однако мы будем придержаться традиционной терминологии, так
как опыт показывает, что возможное неоднозначное толкование термина «строка» легко устраняется
контекстом. (В английском языке этой проблемы не возникает, так как используются два различных
слова: line – линия, строка текста и string – серия, ряд, последовательность, гирлянда…) .Среди
символов строки могут быть эскейп-последоватеьности, т.е. сочетания, соответствующие
неизображаемым символьным константам или символам, задаваемым значениями их внутренних
кодов. В этом случае, как и в представлениях отдельных символов, они начинаются с обратной косой
черты ‘\‘:
//P2-05.CPP – эскейп-кетма-кетликлик ишлатилган сатрлар
#include <iostream.h>
void main() {
cout<<“\nБу сатр, \nиначе - \”стринг\”, \nиначе - ”;
cout<<“\“сатрли литерал\”.”;
}
При выводе на экран дисплея этих строк эскейп-последовательности ‘\n’ и ‘\”’обеспечат
такое размещение информации:
Бу сатр,
иначе - ”стринг”,
иначе - сатрли литерал.
Обратите внимание на наличие символа ‘\n’ перед двойной кавычкой внутри строки. Именно
по наличию этого символа компилятор отличает внутреннюю кавычку от кавычки, ограничивающей
строку.
Дастурда кетма-кет ёки бўш жой ажаратувчиси билан ёзилган сатрлар, компиляция вақтида
қўшилади (конкатениция бўлади). Шунинг учун, дастур матнидаги қуйидаги иккита сатр:
“Сатр – бу белгилар массивидир. ”
“Сатр char[] турига тегишлидир.”
қуйидаги битта сатр билан экивалентдир:
“Сатр – бу белгилар массивидир. Сатр char[] турига тегишлидир.”
Длинную строковую константу можно еще одним способом разместить в нескольких строках
текста программы, используя специальное обозначение переноса – ‘\n’. Пример одной строковой
константы, размещенной на трех в тексте программы:
“Обычно транслятор отводит \
каждой строковой константе \
отдельно место в памяти ЭВМ.”
Қуйидаги дастур сатрларни биттага турли формада “қўшиш” ни намойиш этади:
//P2-06.CPP – сатрларни қўшиш
#include <iostream.h>
void main() {
cout<<“\n2” “0” “10”
“ йил”; //Чиқишда бўш жойлар йўқотилади
cout<<“ жумадан \
бошланди”; //Бу сатрда бўш жойлар сақланади
}
Дастур бажарилиши натижаси:
2010 йил жумадан
бошланди
Натижадиги “бошланди” сўзидан олдинги бўш жойларга эътибор қилинг. Продолжением
перенесенной с помощью символа ‘\’ строки считается любая информация на следующей строке, в
том числе и пробелы.
Сатрни ҳотирага жойлаштиришда, транслятор унинг охирига ‘\0’ белгисини (нолли байт)
автоматик равишда қўшади. Шунинг учун сатрнинг ички тасвирланишида белгилар сони унинг
ёзувидагига нисбатан битта кўп бўлади. Бўш сатр битта ‘\0’ белгиси каби сақланади.
Кроме непосредственного использования строк в вқражениях, строку можно поместить в
символьнқй (типа char) массив с вқбраннқм именам и в дальнейшем обращаться к ней по имени
9
массива. Чаще всего для размещения строковой константы в массиве используются его
инициализации. Қуйидаги дастур кўрсатилган иш ҳаракатни бажаради:
//P2-07.CPP – сатрли ўзгармасни массивда инициализация қилиш
#include <iostream.h>
void main () {
char satr[]=“REPETITIO EST MATER STUDIORUM”;
cout<<“\nsizeof satr =”<< sizeof satr;
cout<<“\n satr = ”<<satr;
}
Дастурнинг бажарилиши натижаси:
sizeof satr = 30
satr = REPETITIO EST MATER STUDIORUM
Эътибор қилингки, char туридаги массивни тавсифлашда унинг satr номидан кейин
[]қавсда элементлар миғдори кўрсатилмаган. Массив ўлчами инициализация вақтида автоматик
равишда подсчитывается и равен количеству символов в строковой инициализирующей константе (в
нашем случае 29) плюс один элемент для завершающего символа ‘\0’.
Кавычки не входят в строку, а служат ее ограничителями при записи в программе. В строке
может быть один символ, например, “A” – строка из одного символа. Однако в отличие от
символьной константы ‘A’ длина внутреннего представления строки “A” равно 2. Сатр “” бўш
бўлиши мумкин, бунда унинг узунлиги 1 га тенг бўлади. Бир сатрли ўзгармас бўш бўлиши мумкин
эмас, т.е. запись ‘’ в большинстве реализаций недопустима.
//P2-08.CPP – сатр ва белгили ўзгармаслар (литерли) узунлиги
#include <iostream.h>
void main() {
cout<<“\nsizeof\”\“=”<<sizeof “”;
cout<<“\tsizeof\‘A\’=”<<sizeof ‘A’;
cout<<“\tsizeof\“A\”=”<<sizeof “A”;
cout<<“\nsizeof\‘\\n\’=”<<sizeof ‘\n’;
cout<<“\tsizeof\“\\n\”=”<<sizeof “\n”;
cout<<“\nsizeof\‘\\xFF\’=”<<sizeof ‘\xFF’;
cout<<“\tsizeof\“\\xFF\”=”<<sizeof “\xFF”;
}
Дастурнинг бажарилиши натижаси:
sizeof“”= 1
sizeof‘A’= 1
sizeof“A”= 2
sizeof‘\n’= 1
sizeof“\n”= 2 sizeof‘\xFF’= 1
sizeof“\xFF”= 2
2.4. Амаллар белгиси
Амал белгилари ифода қийматларини ҳисоблаш шаклларини ва кетма-кетлигини таъминлайди.
Ифода қийматларни олиш учун қоидалар тўплами. Один и тот же знак операции может
употребляться в различных выражениях и по-разному интерпретироваться в зависимости от
контекста. Амалларни тасвири учун кўп ҳолларда бир нечта белгилар ишлатилади. C тилининг ANSIстандартида қуйидаги амал белгилари аниқланган:
[]
()
.
->
++
-@
*
+
~
!
sizeof /
%
<<
>>
<
>
<=
>=
==
!=
^
|
@@
||
?:
=
*=
/=
%=
+=
-=
<<= >>=
@=
^=
|=
,
#
##
C++ да қўшимча қуйидагилар киритилган:
::
.*
->* new delete
typeid
[], (), ва ?: амалларидан ташқари, қолган барча белгиларни компилятор алоҳида лексема
каби танийди. Контекстга боғлиқ равишда битта ва худди шу лексема турли амалларни билдириши
мумкин. Масалан, @ бинар амали – бу битли конъюнкция, унар амали @ эса – бу адресни олиш
амалини билдиради. Одним из принциальных отличий языка C++ от предшествующего ему языка С
является возможность расширения действия, иначе перегрузка (overload) стандартных операций, т.е.
распространения их действия на нестандартные для них операнды. Материал, относящийся к
10
расширению действия (перегрузка) операций, будет рассматриваться в следующих главах. Сейчас
опишем кратко стандартные возможности отдельных операций.
Унар амаллар
@
операнд адресини олиш амали;
*
операция обращения по адресу, т.е. раскрытия ссылки, иначе операция разыменования
(доступа по адресу к значению того объекта, на который указывает операнд). Операнд
адрес бўлиши керак;
унар минус – арифметик операнд ишорасини ўзгартиради;
+
унар плюс (унар минусга симметрия учун киритилган);
~
поразрядное инвертирование внутреннего двоичного кода целочисленного аргумента
(битли инкор);
!
логическое отрицание (НЕ) значения операнда: применяется к скалярнқм операндам;
натижа бутун қийматли 0 (агар операнд нол бўлмаса, яъни чин) ёки 1 (агар операнд нол,
яъни ёлғон). C++ тилида мантиқий қийматлар сифатида бутун сонлар ишлатилади: 0ёлғон ёки нол эмас(!0) – чин. Ихтиёрий нол бўлмаган соннинг инкори 0, нолнинг инкори
1 бўлади. Шунинг учун: !1 0 га тенг; !2 0 га тенг; !(-5) 0 га тенг; !0 1 га тенг;
++
бир бирликка оширади (инкремент ёки автооширгич):
префикс амали – операнддан фойдаланилгунча унинг қийматини 1 бирликка оширилади;
постфикс амали – операнддан фойданилгандан кейин унинг қийматини 1 бирликка
оширилади.
Операнд ўзгармас ёки бошқа праводопустимым ифода бўлиши мумкин эмас. ++5 ёки
84++ ёзувлари нотўғридир. Операндом не может быть и произвольное выражение.
Масалан, ++(j+k) ҳам нотўғри ёзувдир. Операндом унарных операций ++ и – должны
быть всегда леводопустимые выражения, например, переменные (ҳар хил турлар);
-бир бирликка камайтиради (декремент ёки автокамайтиргич) - операция, операндом
которой не может быть константа и праводопустимое выражение:
префикс амали – операнддан фойдаланилгунча унинг қийматини 1 бирликка
камайтирилади;
постфикс амали - операнддан фойданилгандан кейин унинг қийматини 1 бирликка
камайтирилади;
sizeof операция вычисления размера (в байтах) для объекта того типа, который имеет операнд.
Амалнинг иккита форматига рухсат этилган:
sizeof унарли_ифода ва sizeof (тур)
Примеры использования операций с простейшими унарными выражениями, к которым
относятся константы, приводились в связи и изложением материала о константах (P2-04.CPP қаранг).
Бу амални стандарт турларга қўллаб мисол келтирилган:
//P2-09.CPP-хар хил маълумотлар турларининг ўлчамлари
void main() {
cout<<“\nsizeof(int)=”<<sizeof(int);
cout<<“\tsizeof(short)=”<<sizeof(short);
cout<<“\tsizeof(long)=”<<sizeof(long);
cout<<“\nsizeof(float)=”<<sizeof(float);
cout<<“\tsizeof(double)=”<<sizeof(double);
cout<<“\tsizeof(char)=”<<sizeof(char);
}
Дастур бажарилиши натижаси:
sizeof(int)= 2
sizeof(short)= 2
sizeof(long)= 4
sizeof(float)= 4
sizeof(double)= 8
sizeof(char)= 1
Бинар амаллар. Бу амаллар қуйидаги гуруҳларга бўлинади:
 аддитивные;
 мультипликативные;
 силжитиш;
 разряд бўйича (битли);
 муносабат амаллари;
 мантиқий;
11
 таъминлаш;
 структуралашган объект компонентасини танлаш;
 синф компонентаси устида амаллар;
 «вергул» амали;
 қавслар амал сифатида.
Аддитивные амаллар:
+
бинарли плюс (арифметик операндларни қўшиш ёки сложение указателя с целочисленным
операндом);
бинарли минус (кўрсаткич ёки арифметик операндларни айириш).
Мультиприкативные лператорлар:
*
арифметик турдаги операндларни кўпайтириш;
/
арифметик турдаги операндларни кўпайтириш. Стандарт амал. Бутун сонли операндлар
натижасининг абсолют қийматини бутунгача яхлитлайди. Масалан, 20/3 6 га тенг, -20/3 -6
га тенг, (-20)/3 -6 га тенг, 20/(-3) -6 га тенг;
%
бутун сонли операндларни бўлишдаги қолдиқни олади (модул бўйича бўлиш). Манфиймас
операндларда қолдиқ мусбатдир. В противном случае остаток определяется реализацией.
Масалан:
13%4 1 га тенг бўлади, (-13)%4 -1 га тенг бўлади,
13%(-4) +1 га тенг, (-13)%(-4) натижаси эса -1 га тенг.
Бутун сонли операндлар учун нол бўлмаган бўливчида ҳар доим қуйидаги муносабат
бажарилади: (a/b)*b+a%b натижаси a га тенг.
Силжитиш амаллари (фақат бутун сонли оперантлар учун аниқланган). Силжитиш амали ифодаси
формати:
чап_операнд силжитиш_амали ўнг_операнд
<<
сдвиг влево битового представления значения левого целочисленного операнда на
количество разрядов, равное значению правого целочисленного операнда;
>>
сдвиг вправо битового представления значения левого целочисленного операнда на
количество разрядов, равное значению правого целочисленного операнда;
Разрядли амаллар:
&
бутун сонли операндни битли кўринишидаги қийматларини разрядли конъюксияси (ВА);
|
бутун сонли операндни битли кўринишидаги қийматларини разрядли дизъюнкцияси (ЁКИ);
^
бутун сонли операндни битли кўринишидаги қийматларини разрядли инкор ЁКИ и;
Қуйида силжитиш амали ва разрядли амалларнинг асосларини намойиш этадиган дастур:
//P2-10.CPP – силжитиш амаллари ва разрядли амаллар
#include <iostream.h>
void main() {
cout<<“\n4<<2 ”<<(4<<2)<<“ га тенг бўлади”;
cout<<“\t5>>1 ”<<(5>>1)<<“ га тенг бўлади”;
cout<<“\n6&5 ”<<(6&5)<<“ га тенг бўлади”;
cout<<“\tn6|5 ”<<(6|5)<<“ га тенг бўлади”;
cout<<“\t6^5 ”<<(6^5)<<“ га тенг бўлади”;
}
Дастур бажарилиши натижаси:
4<<2 16 га тенг бўлади
5>>1 2 га тенг бўлади
6&5 4 га тенг бўлади
6|5 7 га тенг бўлади
6^5 3 га тенг бўлади
Кимки олдин бутун соннинг битли кўринишига эътибор бермаган бўлса, эслатамизки, 4 учун
иккилик коди 100 га тенг, 5 учун – бу 101, 6 учун – 110 ва ҳ.к. 100 кодини 2 позиция чапга
силжитишда 10000 га тенг бўлади (ўнликда 16 га тенг). Силжитиш ва разрядли амалларнинг қолган
натижалари ҳам шунга ўхшаш бўлади.
Эътибор қилингки, 2 позиция чапга суриш қийматни 2n га кўпайтириш билан эквивалент,
ўнгга суришда уменьшает соответствующее значение в 2n раз с отбрасыванием дробной части
результата. (шунинг учун 5>>1 натижаси 2 га тенг).
12
Муносабат амаллари (таққослаш):
<
кичик;
>
катта;
<=
кичик ёки тенг;
>=
катта ёки тенг;
==
тенг;
!=
тенг эмас;
Муносабат амал операндлари арифметик тур ёки кўрсаткичлардир. Охирги икки амаллар
(тенгликка таққослаш амаллари) қолган боўқа муносабатлар амалларига нисбатан жудаям кичик
бажариш тартибига эга. Шунинг учун, (x<B == A<x) ифода фақат ва фақат x қиймати A ва B
интервалда жойлашган бўлса 1 бўлади. (биринчи навбатда x<B ва A<x ҳисобланади, а к результатам
принемяется операция сравнения на равенство ==)
Мантиқий бинар амаллар:
&&
муносабат ёки арифметик оперантлар конъюкцияси (ВА);
||
муносабат ёки арифметик оперантлар дизъюнкцияси (ЁКИ). Натижа бутун қийматли 0
(ёлғон) ёки 1 (чин) бўлади.
(вспомните а существовании унарной операции отрицания «!».)
Қуйидага дастур бир нечта муносабат ва мантиқий амаллар асосларини намойиш этади:
//P2-11.CPP – муносабат ва мантиқий амаллар
#include <iostream.h>
void main() {
cout<<“\n3<5 ”<<(3<5)<<“ га тенг бўлади”;
cout<<“\t3>5 ”<<(3>5)<<“ га тенг бўлади”;
cout<<“\n3==5 ”<<(3==5)<<“ га тенг бўлади”;
cout<<“\t3!=5 ”<<(3!=5)<<“ га тенг бўлади”;
cout<<“\n3!=5||3==5 ”<<(3!=5||3==5)<<“ га тенг бўлади”;
cout<<“\n3+4>5 && 3+5>4 && 4+5>3 ”<<(3+4>5 && 3+5>4 && 4+5>3)<<“ га
тенг бўлади”;
}
Дастур бажарилиши натижаси:
3<5 1 га тенг бўлади
3>5 0 га тенг бўлади
3==5 0 га тенг бўлади
3!=5 1 га тенг бўлади
3!=5||3==5 1 га тенг бўлади
3+4>5 && 3+5>4 && 4+5>3 1 га тенг бўлади
Таъминлаш амаллари:
В качестве левого операнда в операциях присваивания может использоваться только
модифицируемое l-значение – ссылка на некоторую именованную область памяти, значение которой
доступно изменениям. Термин l-значение (left value), иначе – леводопустимое выражение,
происходит от объяснения действия операции присваивания E=D, в которой операнд E слева от знака
операции присваивания может быть только модифицируемым l-значением. Примером
модифицируемого l-значения служит имя переменной, которой выделена память и соответствует
некоторый класс памяти. Итак, перечислим операции присваивания:
=
оперантнинг ўнг қисмидаги ифода-оперант қийматини чап қисмга таъминлайди: P=10.3 –
2*x;
*=
оперантднинг чап қисмига иккала операндлар кўпайтмасини таъминлайди: P*=2 ифода
P=P*2 ифодага эквивалентдир;
/=
оперантднинг чап қисмига операнднинг чап томонидаги қийматини ўнг томонидаги
қийматига бўлиб таъминлайди: P/=2.2-d ифода P=P/(2.2-d)ифодага эквивалентдир;
%=
Присвоить операнду левой части остаток от деления целочисленного значения левого
операнда на целочисленное значение правого операнда:
N%=3 ифода N=N%3 ифодага эквивалентдир;
+=
оперантднинг чап қисмига иккала операндлар йиғиндисини таъминлайди: A+=B ифода
A=A+B ифодага эквивалентдир;
13
оперантднинг чап қисмига чап ва ўнгдаги операндлар қийматлари айирмасини
таъминлайди: X-=4.3-Z ифода X=X-(4.3-z) ифодага эквивалентдир;
<<=
присвоить целочисленному операнду левой части значение, полученное сдвигом влево его
битового представления на количество разрядов, равное значению правого целочисленного
операнда: a<<=4 ифода a=a<<4 ифодага эквивалентдир;
>>=
присвоить целочисленному операнду левой части значение, полученное сдвигом вправо его
битового представления на количество разрядов, равное значению правого целочисленного
операнда: a>>=4 ифода a=a>>4 ифодага эквивалентдир;
&=
присвоить целочисленному операнду левой части значение, полученное поразрядной
конъюнкцией (И) его битового представления с битовым представлением целочисленного
операнда правой части: e&=44 ифода e=e&44 ифодага эквивалентдир;
|=
присвоить целочисленному операнду левой части значение, полученное поразрядной
дизъюнкцией (ИЛИ) его битового представления с битовым представлением
целочисленного операнда правой части: a|=b ифода a=a|b ифодага эквивалентдир;
^=
присвоить целочисленному операнду левой части значение, полученное применением
поразрядной операции исключающего ИЛИ к битовым представлениям значений обоих
операндов: z^=x+y ифода z=z^(x+y) ифодага эквивалентдир;
Эътибор қилингки, ҳамма амал учун таъминлашнинг E1 амал = E2 амал қисқа формаси
E1 = E1 амал (E2) га эквивалентдир, бу ерда амал – амалнинг маъносидир.
Бир нечта асосий таъминлаш амалларни бажаришни намойиш қилиш, қуйидаги дастурда
қаралган:
//P2-12.CPP – таъминлаш амаллари
#include <iostream.h>
void main() {
int k;
cout<<“\n\nk=35/4 ”<<(k=35/4)<<“ га тенг бўлади”;
cout<<“\tk/=1+1+2 ”<<(k/=1+1+2)<<“ га тенг бўлади”;
cout<<“\nk*=5-2 ”<<(k*=5-2)<<“ га тенг бўлади”;
cout<<“\tk%=3+2 ”<<(k%=3+2)<<“ га тенг бўлади”;
cout<<“\nk+=21/3 ”<<(k+=21/3)<<“ га тенг бўлади”;
cout<<“\tk-=6-6/2 ”<<(k-=6-6/2)<<“ га тенг бўлади”;
cout<<“\nk<<=2 ”<<(k<<=2)<<“ га тенг бўлади”;
cout<<“\tk>>=6-5 ”<<(k>>=6-5)<<“ га тенг бўлади”;
cout<<“\nk&=9+4 ”<<(k&=9+4)<<“ га тенг бўлади”;
cout<<“\tk|=8-2 ”<<(k|=8-2)<<“ га тенг бўлади”;
cout<<“\nk^=10 ”<<(k^=10)<<“ га тенг бўлади”;
}
Биринчи таъминлашдаги бутун сонли операндларни бўлишни бажарилишига эътибор
қилингки, яхлитлашда натижанинг каср қисми ташлаб кетилмоқда.
Бажарилиши натижаси:
-=
k=35/4 8 га тенг бўлади
k/=1+1+2 2 га тенг бўлади
k*=5-2 6 га тенг бўлади
k%=3+2 1 га тенг бўлади
k+=21/3 8 га тенг бўлади k-=6-6/2 5 га тенг бўлади
k<<=2 20 га тенг бўлади
k>>=6-5 10 га тенг бўлади
k&=9+4 8 га тенг бўлади
k|=8-2 14 га тенг бўлади
k^=10 4 га тенг бўлади
Полученные числовые значения, во-первых, подтверждают эквивалентность записей E1
амал = E2 амал ва E1 = E1 амал (E2). Бундан ташқари, натижаларни таҳлил қиламиз,
разрядли амаллар хусусиятларини яна бир қараймиз. 5 га тенг бўлган k учун иккилик код 101 бўлади.
Чапга 2 га силжитиш 1010 ни беради (ўнликда 20). Кейин 1 га ўнгга силжитишда 1010 коди ҳосил
бўлади (ўнликда 10). Разрядли конъюнкция 1010&1101 1000 ни беради (ўнликда 8). Кейин 1000|110
1110 қийматни беради (ўнликда 14). 1110^1010 натижаси 0100 бўлади (ўнликда 4).
Структуралашган объект компонентасини танлаш амаллари:
. (нуқта) структуралашган объект компанентасини бевосита танлаш, масалан бирлаштириш. Амал
14
формати:
структуралашган объект номи_компонента номи
косвенный выбор (выделение) компонента структурированного объекта, адресуемого
указателем. Амалдан фойдаланишда объект кўрсаткич билан алоқада бўлиши талаб
этилади. Бу ҳолатда амалнинг кўриниши қўйидагича бўлади:
структуралашган_объектга_кўрсаткич->компонента_номи
Так как операции выбора компонентов структурированных объектов используются со
структурами, объединениями, классами, то необходимые пояснения и примеры мы приведем позже,
введя перечисленные понятия и, кроме того, определив указатели.
Синф компоненталари устида амаллар:
.*
объект номи ва компонентага кўрсаткич бўйича синф компонентасига бевосита мурожаат;
->
компоненга кўрсаткичга ва объектга кўрсаткич орқали синф компонентасига билвосита
мурожаат.
Бу амалларга изоҳ бериш кейин, чунки синф ҳақида тушунчалар берилмаган, сабаби бу кейинчалик
берилади.
::
кўриниш соҳани кўрсатувчи амалнинг икки формаси мавжуд: бинар ва унар. Бинар
формаси сонф компонентасига мурожаат учун қабул қилинган. Унарная операция “::”
позволяет получить доступ к внешней для некоторой функции именованной области
памяти. Қуйидаги дастур унар амалининг имкониятларини кўрсатади:
//P2-13.CPP – ташқи ўзгарувчининг кўриниш соҳасини ўзгартириш
#include <iostream.h>
int k=15; //Бошланғич қиймат билан глобал ўзгарувчи
void main() {
int k=10; //Бошланғич қиймат билан локал ўзгарувчи
cout<<“\nТашқи ўзгарувчи k= ”<<::k;
cout<<“\nИчки ўзгарувчи k= ”<<k;
::k=0;
cout<<“\nТашқи ўзгарувчи k= ”<<::k;
cout<<“\nИчки ўзгарувчи k= ”<<k;
}
Дастурнинг бажарилиш натижаси:
Ташқи ўзгарувчи k= 15
Ички ўзгарувчи k= 10
Ташқи ўзгарувчи k= 0
Ички ўзгарувчи k= 10
Мисолдан кўриниб турибдики, “::” унар амали ёрдами билан функция танасидан туриб ташқи
ўзгарувчиларга мурожаатни ташкилаштириш мумкин, агарда функйия танасида ҳам худди шу номли
ўзгарувчи аниқланган бўлса. Бу амалнинг бошқа имкониятлари синфлар билан ишлаш
имкониятларини беради.
Вергул амал сифатида:
вергул билан ажратилган кўпгина ифодалар чапдан ўнгга кетма-кетлигида бажарилади.
Натижа сифатида энг ўнг томондаги ифоданинг тури ва қиймати сақланади. Шунинг учун,
“вергул” амали чапдан ўнгга ҳисоблашларни гуруҳлайди. Тип и значение результата
определяются самым правым из разделенных запятыми операндов (ифодалар). Барча чап
томондаги операндлар ташлаб кетилади. Масалан:
//P2-14.CPP – вергул амал белгиси сифатида
#include <iostream.h>
void main() {
int d;
cout<<“\nd=4, d*2 ифодаси ”<<(nd=4, d*2)<<“ га тенг”;
cout<<“, d ”<<d<<“ га тенг”;
}
Дастур экранга қуйидагиларни чоп этади:
d=4, d*2 ифодаси 8 га тенг, d 4 га тенг
->
15
Айлана ‘()’ ва ‘[]’ квадрат қавслар функцияни чақиришда ва массив элементларини
индекслашда бинар амал ролини ўйнайди. Для программиста, мало знакомого с техникой
использования указателей, мысль о том, что скобки в ряде случаев являются бинарными операциями,
часто даже не приходит в голову. И это тогда, когда он практически в каждой программе обращается
к функциям или применяет индексированные переменные. Итак, отметим, что скобки могут служить
бинарными операциями, особенности и возможности которых достойны внимания.
Функцияга мурожаатда айлана қавс ишлатилади:
функция_номи(аргументлар_рўйхати)
Бу ерда операнд сифатида функция_номи ва аргументлар_рўйхати хизмат қилади.
Результат вызова вычисляется в теле функции, структуру которого задает ее определение.
массив_номи[индекс] ифодада ‘[]’ амали учун оперант сифатида массив_номи ва индекс
хизмат қилади. C ва C++ тилида массив индекслари нолдан бошланиши қабул қилинган, яъни z[3]
учта элементдан массив z[0], z[1], z[2] индекслар орқали элементларга мурожаат қилинади. Это
соглашение языка становится очевидным, если учесть, что индекс определяет не номер элемента, а
его смещение относительно начала массива. Шунинг учун, z[0] – биринчи элементга мурожаат, z[1] –
иккинчи элементга мурожаат ва ҳ.к. Қуйидаги дастурда массив элементлари билан ишлашда квадрат
қавсдан оддий фойдаланиш кўрсатилган:
//P2-15.CPP – массив элементлари билан ишлаш
#include <iostream.h>
void main() {
char x[]=“DIXI”; //“Мен айтдим”
int i=0;
while (x[i] != ‘\0’)
cout<<“\n”<<x[i++];
}
Натижа – сўзи “DIXI” устунда ёзилган (юқоридан пастга):
D
I
X
I
Оператор цикла с заголовком while выполняется, пока верно выражение в скобках, т.е. пока
очередной символ массива не равен ‘\0’. При каждом вычислении выражения x[i++]используется
текущее значение i, которое затем увеличивается на 1. Бу ҳолатда квадрат қавс бинар амал ролини,
ўйнайди, операнд эса массив номи x ва i++ индекс хизмат қилади.
В C++ действие операций ‘[]’ и ‘()’ расширено (они перегружены – overload), но об этом
нужно говорить в связи с классами.
Именно из-за появления в языке C++ механизма расширения действия (перегружены –
overload) стандартных операций и в связи с необходимостью расширять действие скобок-операций
на необычные для них операнды скобки ‘[]’, ‘()’ отнесены к стандартным операциям языка C++.
Шартли амал. Унар ва бинар амаллардан фарқли равишда шартли операторда учта операнд
ишлатилади. В изображении условной операции два размещенных не подряд символа ‘?’, и ‘:’ ва
учта операнд-ифода:
ифода_1? ифода_2: ифода_3
Биринчи ифода_1 қиймати ҳисобланади. Агар у чин бўлса, яъни нолга тенг бўлмаса, у ҳолда
натижа ифода_2 қиймати ҳисобланади. Агар ифода_1 ни ҳисоблашда 0 олинса, у ҳолда натижа
сифатида ифода_3 қиймати ҳисобланади. Классик масала:
x<0?-x:x;
Ифода x ўзгарувчининг абсолют қийматини қайтаради.
Операция явного преобразования (приведения) типа в языка C++ имеет две различные формы.
Каноническая, унаследованная от языка C, имеет следующий формат:
(тур_номи) операнд
и позволяет преобразовывать значение операнда к нужному типу. В качестве операнда
используется унарное выражение, которое в простейшим случае может быть переменной, константой
16
или любым выражением, заключенным в круглые скобки. Например, следующие преобразования
изменяют длину внутреннего представления целых констант, не меняя их значений:
(long)1 – внутреннее представление имеет длину 4 байта;
(char)1 – внутреннее представление имеет длину 1 байта.
В этих преобразованиях константа не меняла значения и оставалась целочисленной. Однако
возможны более глубокие преобразования, например, (long double)1 или (float)1 не только изменяют
длину константы, но и структуру ее внутреннего представления. В ней будут выделены порядок и
мантисса. При преобразовании длинных целочисленных констант к вещественному типу (например,
к типу float) возможна потеря значащих цифр (потеря точности). Если вещественное значение
преобразуется к целому, то возможна ошибка при выходе полученного значения за диапазон
допустимых значение для целых. В этом случае результат преобразования непредсказуем и целиком
зависит от реализации.
Кроме рассмотренной канонической операции явного приведения типа, которая унаследована
языком C++ от языка C, в языке C++ введена еще одна возможность приведения типов, которую
обеспечивает функциональная форма преобразования типа:
тур_номи(операнд)
Она может использоваться только в тех случиях, когда тип имеет простое (несоставное)
наименование (обозначение):
long(2) – внутреннее представление имеет длину 4 байта;
double(2) – внутреннее представление имеет длину 8 байта.
Однако будет недопустимым выражение:
unsigned long(2) //Ҳато
Хотирани динамик тақсимлаш учун new ва delete амаллар. Это еще особый унарные
операции, появившиеся в языке C++. Улар хотирани бошқарадиган масала бири билан боғлиқ, айнан
уни динамик тақсимлайдиган. Амал
new тур_номи
ёки
new тур_номи инициализатор
позволят выделить и сделать доступным свободный участок в основной памяти, размеры
которого соответствуют типу данных, определяемому именем типа. Унчалик шарт бўлмаган
эмлементда, яъни инициализаторда аниқланган қийматни ажратилган соҳага жойлаштиради. new
амалини хатосиз бажарилиш ҳолатида ажратилган хотира соҳасининг бошланғич манзили қайтади.
Если участок нужных размеров не может быть выделен (нет памяти), то операция new возвращает
нулевое значение адреса (NULL). Синтаксис применения операции:
кўрсаткич = new тур_номи инициализатор
Бу ерда унчалик шарт бўлмаган инициализатор – бу айлана қавсга олинган ифода.
Указатель, которому присваивается получаемое значение адреса, должен относиться к тому же типу
данных, что и тур_номи в операции new. О размерах участков памяти уже упоминалось в связи и
константами разных типов. Поэтому, не вводя пока других понятий, относящихся к типам данных,
приведем несложные примеры.
new float амали хотирадан 4 байт ўлчамдаги соҳани ажратади. new int (15) амали хотирадан
2 байтли соҳа ажратади ва бу соҳага бутун 15 қийматни инициализация қилади. Синтаксис
использования операций new и delete предполагает применение указателей. Предварительно
каждый указатель должен быть определен.
Кўрсаткични аниқлаш куйидаги кўринишга эга:
тур *кўрсаткич_номи
Кўрсаткич_номи – бу идентификатордир. В качестве типа можно использовать, например,
уже упомянутые стандартные типы int, long, float, double, char. Таким образом, int
*h; - определение указателя h, который может быть связан с участком памяти, выделенным для
величины целого типа.
Введя с помощью определения указатель, можно присвоить ему
возвращаемое операцией new значение:
h = new int(15);
Кейинчалик ажратилган хотира соҳасига мурожаат *h ифода таъминлайди.
17
В случае отсутствия в операции new инициализатора значение, которое заносится в
выделенный участок памяти, не определено и не следует рассчитывать, что там будет, например,
нуль.
Если в качестве имени типа в операции new используется массив, то для массива должны
быть полностью определены все размерности. Но при этом инициализация участка памяти,
выделяемого для массива, запрещена. Подробнее о выделении памяти для массивов речь пойдет в
главе 5.
Продолжительность существования выделенного с помощью операции new участка памяти –
от точки создания до конца программы или до явного его освобождения.
Для явного освобождения выделенного операцией new участка памяти используется оператор
delete кўрсаткич; бу ерда кўрсаткич new амали ёрдами билан олдин ажратилган
бўшатилаётган хотира соҳисининг манзили. Масалан, delete h; – h кўрсаткичи билан боғланган
хотира соҳасини бўшатади. Повторное применение операции delete к тому же указателю дает
неопределенный результат. Также непредсказуем результат применения этой операции к указателю,
получившему значение без использования операции new. Однако применение delete к указателю с
нулевым значением не запрещено, хотя и не имеет особого смысла.
Иллюстрацией к сказанному служит следующая программа, в которой с одним указателем
целого типа последовательно связываются четыре динамически выделяемых участка памяти:
//P2-16.CPP – ҳотирани динамик тақсимлаш
#include <iostream.h>
void main() {
int *i;
i=new int(1);
cout<<“\n*i=”<<*i<<“\t*i=”<<i;
i=new int(5);
cout<<“\t*i=”<<*i<<“\t\t*i=”<<i;
i=new int(2**i);
cout<<“\n*i=”<<*i<<“\t*i=”<<i;
i=new int(2**i);
cout<<“\t*i=”<<*i<<“\t\t*i=”<<i;
delete i;
cout<<“\n Ҳотирани бўшатгандан кейин:”;
cout<<“\n*i=”<<*i<<“\t*i=”<<i;
delete i;//Некорректное применение операции
cout<<“\t*i=”<<*i<<“\t*i=”<<i;
}
Дастур бажарилиши натижаси:
*i=1
i=0x91790004
*i=5
i=0x917a0004
*i=10
i=0x917b0004
*i=20
i=0x917c0004
Ҳотирани бўшатгандан кейин:
*i=20
i=0x917c0004
*i=-28292
i=0x917c0004
Обратите внимание, что после выполнения первого оператора delete i; значение
указателя и содержимое связанного с ним участка памяти *i еще сохранились. После вторичного
применения операции delete значение указателя не изменилось, а содержимое связанного с ним
участка памяти «испортилось». Указанные изменения и (или) сохранении значения *i не
обязательны зависят от реализации и от конкретного исполнения программы. В ряде случаев при
работе с интегрированной средой ВС++ версии 3.1 выдается сообщение об ошибке:
Null pointer assignment
Для освобождения памяти, выделенной для массива, используется следующая модификация
того же оператора:
delete [] кўрсаткич;
где указатель связан с выделенным для массива участком памяти.
Амаллар ранги. C++ тилининг қисқача шарҳининг якунида амалларнинг бажарилиш тартиби,
ёки ранги жадвали келтирилган.
18
2.4 – жадвал
Амаллар бажарилиш тартиби
Амаллар
Ассоцативность
() [] -> :: .

! ~ + - ++ -- & * (тур) sizeof new delete тур()

(турни ўзгартирувчи функциялар)
3
.* ->*

4
* / % (мультипликативные бинарные операции)

5
+ - (аддитивные бинарные операции)

6
<< >>

7
< <= >= >

8
== !=

9
&

10
^

11
|

12
&&

13
||

14
?: (шартли амал)

15
= *= /= %= += -= &= ^= |= <<= >>=

16
, («вергул» амали)

C++ тили грамматикасида амалларнинг бажарилиш тартибининг 16 категорияси аниқланган.
2.4 – жадвалда бажарилиш тартиб категорияси ранг деб номланган. 1 рангли амал энг юқори
тартиблидир. Операции одного ранга имеют одинаковый приоритет, и если их в выражениях
несколько, то они выполняются в соответствии с правилом ассоциативности либо слева направо (),
либо справа налево (). Если один и тот же знак операции приведен в таблице дважды, то первое
появление (с меньшим по номеру, т.е. старшим по приоритету, рангом) соответствует унарной
операции, а второе – бинарной. Отметим, что кроме стандартных режимов использования операций
язык C++ допускает расширение их действий на объекты классов, вводимых пользователем или уже
определенных в конкретной реализации языка. Примером такого расширения (перегрузка) является
операция извлечения данных из потока << и операция передачи данных в выходной поток >>,
применяемые к потокам ввода и cin вывода cout.
2.5 Ажратувчилар
Ажратувчилар ёки пунктуация белгилари тил лексемаси входят в число.
[]
()
{}
,
;
:
…
*
=
#
&
Квадратные скобки ‘[]’ ограничивают индексы одно-и многомерных массивов и
индексированных элементов:
//Бешта элементдан иборат бўлган бир ўлчовли массив:
int A[]={0, 2, 4, 6, 8};
//e – икки ўлчовли массив – 3*2 ўлчамдаги матрица:
int x, e[3][2];
//e массивнинг бошланғич элементига ва x ўзгарувчи 4 (A массивнинг
//учинчи элементи)қиймати таъминланмоқда:
e[0][0]=x=A[2];
Айлана қавслар ‘()’ :
1) шартли ифодаларни белгилаш (“шартли” операторда):
if(x<0) x=-x; //Арифметик ўзгарувчининг модул қиймати
2) входят как обязательнқе элементқ в определение и описание (в прототип) любой функции,
где вқделяют соответственно список формальнқх параметров и список спецификаций
параметров:
float F(float x, int k) //Функцияни аниқлаш
{ функция_танаси}
float F(float x, int k) //Определение функции – ее прототип
…
Ранг
1
2
19
F(z,n);
//Функцияни чақириш
3) обязательные в определении указателя на функцию:
int (*func) (void);
//Определении указателя на функцию
4) группируют выражения, изменяя естественную последовательность выполнения операций:
Y=(a+b)*c; //Амалларнинг бажарилиш тартибини ўзгартириш
5) цикл операторларига керакли элемент сифатида киради:
for (i=0,j=1; i<j; i+=2, j++) цикл_танаси;
while (i<j) цикл_танаси;
do цикл_танаси while (k>0);
6) необходимы при явном преобразовании типа. Как показано выше при описании операций, в
C++ существуют две формы задания явного преобразования типов: приведение типа
(тур_номи)операнд и функциональное приведение – тур_номи(операнд), бу ерда операнд –
бу ихтиёрий скаляр ифодадир. В обеих формах явного приведения типа круглые скобки обязательны.
Масалан:
long i=12L; int j; //Ўзгарувчиларни аниқлаш
j=int(i);
//Функциональная запись преобразования
float B;
//Ўзгарувчиларни аниқлаш
B=(float)j;
//Явное приведение типа
j получает значение 12L,
преобразование к типу int. Затем в получает значение 12,
преобразованное к типу float.
7) применение круглых скобок настоятельно рекомендуется в макроопределениях,
обрабатывамых препроцессором:
#define R(x,y) sqrt((x)*(x)+(y)*(y))
Это позволяет использовать в качестве параметров макровызовов арифметические выражения
любой сложности и не сталкиваться с нарушениями приоритетов операций (8 бобга қар.).
Фигурали қавс ‘{}’ блок ёки мураккаб операторнинг мос равишда бошланиши ва тугашини
билдиради. Шартли операторда мураккаб оператордан фойдаланишга мисол:
if(d>x) { d--; x++;+}
Функция танаси ҳисобланувчи блокка мисол:
float exponent (float x, int x){
float d=1.0; int i=0;
if(x==0) return 0.0;
for(;i<abs(n);i++, d*=x);
return n>0?d:1.0/d;
}
Эътибор қилингки, мураккаб оператор ёки блокнинг тугашини билдирувчи ёпилаётган қавс
‘}’ кейин нуқта вергул ташлаб кетилган.
Структура, бирлашма, синф туриларини аниқлашда компоненталар рўйхатини белгилаш учун
фигурали қавс ишлатилади:
struct cell { char *b;
//Структура турларини тавсифлаш
in tee;
double U[6];
};
union smes { unsigned int ii;
//бирлашма туриларини тавсифлаш
char cc[2];
};
class sir { int B;
//Синфни тавсифлаш
public:
int X, D;
sir (int);
};
Эътибор қилингки, ҳар бир тур тавсифидан (аниқланишидан) кейин нуқта вергул қўйилиши
талаб этилади.
Массивлар ва структураларни тавсифлашда, уларни инициализация вақтида фигурали қавслар
ишлатилади:
20
//Массивларни инициализация қилиш:
int month[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
//mixture туридаги stock структурани инициализация қилиш:
struct mixture {int ii; double dd; char cc;};
stock={666, 3.67, ‘\t’};
Мисолдаги mixture – учта ҳар хил турдаги компоненталардан иборат структура турининг
номи, stock – mixture туридаги аниқ структура номи. stock структурадаги ii, dd, cc
компоненталар инициализация вақтида қийматларни қабул қилади.
В следующей программе описана структура с именем constant и выполнена ее
инициализация, т.е. ее компонентам типа long double присвоены значения знаменитых констант:
//P2-17.CPP – структурадаги ва унинг инициализация вақтидаги фигурали
//
фигурали қавслар
#include <iostream.h>
void main() {
struct { long double pi;
long double e;
} constant = {3.1415926535897932385,
2.7182818284590452354 };
cout<<“\n”<<constant.pi<<“\t”<<constant.e;
}
Экранга қуйидагилар чоп этилади:
3.141593 2.718282
cout стандарт оқимининг ишидаги жимлик бўйича танланган аниқликка (фақат қиймат 7 та
цифр) эътибор қилинг.
Вергул ‘,’ рўйхатдаги элементларни ажратади. Биринчидан, бу рўйхатлар это списки
начальных значений, присваиваемых индексированным элементам массивов и компонентам структур
при их инициализации:
char name[]={‘С’,‘и’,‘р’,‘а’,‘н’,‘о’};//Бу сатр эмас!
struct A {int x; float y; char z;};
F={3, 18.4, ‘c’};
Рўйхатга бошқа бир мисол – списки формальных и фактических параметров и их
спецификация в функциях.
Учинчидан for цикл оператор сарлавҳасида ажратувчи каби ишлатиш:
for (x=p1, y=p2,i=2; i<n; z=x+y, x=y, y=z, i++);
(В данном примере вычисляется n –ий член ряда Фибоначчи z по значениям первых двух p1
и p2.)
Бир турдаги объектлар (ўзгарувчи) ни тавсифлаш ва аниқлашда ҳам вергул ажратувчи каби
ишлатилади:
int i, n;
float x, y, z, p1, p2;
Вергул амал сифатида келиши олдин қаралган. Следует обратить внимание на необходимость
с помощью круглых скобок отделять запятую-операцию от запятой-разделителя. Масалан, қуйидаги
дастурда массив элементлари учун учта бошланғич қийматли рўйхат ишлатилмоқда:
//P2-18.CPP – вергул ҳам ажратувчи ва ҳам амал белгиси каби
#include <iostream.h>
void main() {
int i=1, m[]={i, (i=2, i*i), i};
cout<<“\ni=”<<i<<“\tm[0]=”<<m[0];
cout<<“\tm[1]=”<<m[1]<<“\tm[2]=”<<m[2];
}
Экрандаги натижа:
i=2 m[0]=1
m[1]=4
m[2]=2
Келтирилган мисолдаги айлана қавсдаги вергул амал белгиси ролида намоёт бўлмоқда. “=”
таъминлаш амалининг бажарилиш тартиби “вергул” амалига қараганда юқори. Шунинг учун
биринчи навбатда i 2 қийматни олади, кейин i*i кўпайтма ҳисобланади ва бу натижа қавс
ифодасининг қиймати бўлиб хизмат қилади. Бироқ i ўзгарувчининг қиймати 2 лигича қолади.
21
В качестве еще одной области применения запятой как разделителя нужно отметить описание
производного класса, где используются список базовых классов и список вызываемых
конструкторов. В каждом из них могут понадобиться запятые. Бундан ташқари, синфнинг бир
турдаги компоненталар рўйхатида улар бир бири билан вергул билан ажратилади.
Нуқта вергул ‘;’ ҳар бир оператор, ҳар бир аниқлашни (функция аниқланишидан ташқари) ва
ҳар бир тавсифни тугатади. Любое допустимое выражение, за которым следует ‘;’, воспринимается
как оператор. Это справедливо и для пустого выражения, т.е. отдельный символ «точка с запятой»
считается пустым оператором. Бўш оператордан тез-тез цикл оператор танаси каби фойданилади.
Примером может служить цикл for, приведенный выше для иллюстрации особенностей
использования запятой в качестве разделителя (Фиббоначчи қаторининг n–ҳадини ҳисоблаш).
Оператор-ифодага мисол:
i++; //Бажарилиш натижасида фақат нинг қиймати ўзгаради
F(z,4)
//Результат определяется телом функции с именем F
Икки нуқта ‘:’ служит для отделения (соединения) метки и помечаемого ею оператора:
нишон: оператор;
Нишон – бу идентифакотрдир. Шунинг учун, масалан, операторларни қуйидагича белгилаш
ўринлидир:
XYZ: a=(b-c)*(d-c); cc:z*=1;
Второе применение двоеточия – описание производного класса, где имя класса отделяется от
списка базовых классов двоеточием:
синф_калити синф_номи: базали_рўйхат {компоненталар_рўйхати}
Синф_калити – қуйидаги учта хизматчи сўзлардан биридир: struct, union, class.
Синф_номи –
ихтиёрий танланган идентификатор. Базали_рўйхат – это список имен
порождающих (базовых) классов. Не определяя списка компонентов (к чему вернемся, рассматривая
классы), приведем пример определения производного класса:
class x: A, B {компоненталар_рўйхат};
Кўп нуқталар – бу орасида бўш жойларсиз “...” уч нуқтадир. Оно используется для
обозначения переменного числа параметров у функции при ее опеределении и описании (при
задании ее прототипа). При работе на языке Си программист очеть частоо использует библиотечные
функции сос списком параметров переменной длины для форматных ввода и вывода. Уларнинг
прототоплари қуйидаги кўринишларга эга бўлишади:
int printf(char *format, …);
int scanf (char *format, …);
Бу ерда кўп нуқта ёрдамида ҳар хил сондаги параметрлардан фойдаланиб функцияга мурожаат
қилиш кўрсатилган (не меньше одного, так как параметр format должен быть указан всегда и не
может опускаться).
Подготовка своих функций с переменным количеством параметров на языке Си++ требует
применения средств адресной арифметики, например, предоставляемых головным файлом stdarg.h.
Описание макросов va_arg, va_end, va_start для организации доступа из тела такой функции к
спискам ее параметров приведено в главе 6.
Звездочка ‘*’, как уже упоминалось, используется в качестве знака операции умножения и
знака операции разыменования (получения значения через указатель). В описаниях и определениях
звездочка означает, что описавается указатель на значение использованного в объявлении типа:
int *point; // Указатель на величину типа int
char **refer; // Указатель на указатель на величину типа char
Знак ‘=’, как уже упоминалось, является обозначением операции присваивания. Кроме того, в
определении он отделяет описание объекта от списка его инициализации:
struct {char x, int y} A = {‘z’, 1918};
int F = 66;
Функциянинг формал параметрлар рўйхатидаги ‘=’ белгиси аргумент (фактик параметр)
қийматини жимлик бўйича танлашни кўрсатади:
char CC (int Z=12, char L= ‘\0’) {…}
Жимлик бўйича Z параметр 12 га тенг, L параметр ‘\0’ га тенг.
22
Символ ‘#’ (знак номера или диеза в музыке) используется для обозначения директив (команд)
препроцессора. Если тот символ является первым отличным от пробела символом в строке
программы, то строка воспринимается как директива препрцессора.
‘&’ белгиси илова турдаги ўзгарувчини тавсифлашда ажратувчи ролини ўйнайди:
int B; // Ўзгарувчининг тавсифи
int &A=B; // A – B га илова
Отметив использование символа ‘&’ в качестве разделителя при описании ссылок, отложим
подробное рассмотрение ссылок.
3-Боб. СКАЛЯР ТУРЛАР ВА ИФОДАЛАР
3.1. Асосий ва ясалган турлар
Турлар ҳақида гап кетганда ўзгарувчилардан бошлаймиз. В пособиях по языкам
программирования переменную чаще всего определяют как пару «имя» - «значения». Ажратилган
ўзгарувчининг номига хотира соҳасининг манзили (адреси, илова) мос келади, қиймат эса бу
соҳанинг мазмуни ҳисобланади. Именем служит идентификатор, а значение соотвествует типу
переменной, определяющему множество допустимых значений и набор операций, для которых
переменная может служить операндом. Одатда ўзгарувчининг мумкин бўлган қийматлар тўплами шу
турдаги ўзгармасларга мумкин бўлган тўплами бўйича мос келади (2.1 – 2.2 жадвалга қаранг).
Шунинг учун ҳақиқий, бутун ва белгили ўзгарувчилар киритилган, шу билан бирга белгили (char)
тур кўпинча бутун турга тегишли бўлади. Бутун сонли ва ҳақиқийлар арифметик турлар
ҳисобланади. Арифметический (включая символьный) тип является частным случаем скалярных
типов. Арифметикдан ташқари скаляр турларга кўрсаткичлар,
23
Download