Global o'zgaruvchilar
Global o'zgaruvchilar o'sha nomdagi lokal o'zgaruvchilar tavsiflanmagan barcha funksiyalarda ko'riladi, shuning uchun ularni funksiyalar orasida ma'lumotlarni uzatish uchun foydalanish juda oson. Shunga qaramay bu tavsiya etilmaydi, chunki dasturni sozlashni qiyinlashtiradi va umumiy foydalanishdagi kutubxonaga funksiyalarni joylashtirishga to'sqinlik qiladi. Funksiyalar maksimal bog'liq bo'lmasligiga ularning interfeysi to'liq funksiya prototipi bilan aniqlanishiga harakat qilish lozim.
Qaytariluvchi qiymat
Funksiyadan uni chaqiruvchi funksiyaga qaytaruvchi mexanizm
return [ ifoda ];
operator bilan bajariladi.
Funksiya bir nechta return operatorlarni o'z ichiga olishi mumkin (bu algoritm ehtoyoji bilan aniqlanadi). Agar funksiya void kabi tavsiflangan bo'lsa, ifoda ko'rsatilmaydi. return operatorini void tipidagi funksiya uchun agar undan qaytish yopiladigan o'rta qavs oldidan ro'y bersa va main funksiyasi uchun tashlab yuborish mumkin. Bu yerda joyni tejash uchun main funksiyasidagi return operatori ko'rsatilmagan. Shuning uchun misollarni kompilyatsiyalashda ogohlantirish beriladi. returndan so'ng ko'rsatilgan ifoda oshkormas ravishda funksiya qaytaruvchi qiymat tipiga almashtiriladi va funksiyani chaqirish nuqtasiga uzatiladi.
Misollar:
int f1(){return 1; } // to'g'ri
void f2(){return 1; } // noto'g'ri f2 qiymatni qaytarmasligi lozim
double f3(){return 1;} // to'g'ri, 1 double tipiga almashtiriladi
DIQQAT
Fynksiyadan lokal o'zgaruvchiga ko'rsatgichga qaytish mumkin emas, chunki funksiyaga kirishda lokal o'zgaruvchilarga ajratilgan xotira undan qaytarilgandan so'ng tozalanadi.
Misol:
int* f(){
int a = 5;
return &a; // mumkin emas!
}
Funksiya parametrlari
Parametrlar mexanizmi chaqiriladigan va chaqiriluvchi funksiya orasida axborot almashuvining asosiy usuli hisoblanadi. Funksiya tavsifi sarlavhasida sanab o'tilgan parametrlar deb yoki oddiy qilib parametrlar deb, funksiya chaqirish operatorida yozilganlari – faktik parametrlar yoki argumentlar deb ataladi.
Funksiyani chaqirishda birinchi navbatda argumentlar o'rnida turuvchi ifodalar hisoblanadi, so'ngra stekda funksiya formal parametrlariga xotira ularning tipiga mos ajratiladi va ularning har biriga tegishli argument qiymati beriladi. Bunda tiplar mosligi tekshiriladi va zarur bo'lganda ularni almashtirishlar bajariladi. Tiplar mos kelmaganda diagnostik xabar uzatiladi.
Parametrlarni funksiyaga qiymat va manzil bo'yicha uzatishning ikkita usuli mavjud.
Qiymat bo'yicha uzatishda stekka argumentlar qiymatlari nusxalari kiritiladi va bu nusxalar funksiya operatorlari bilan ish ko'radi. Parametrlarning dastlabki qiymatlariga kirish funksiyada yo'q, demak, ularni o'zgartirish imkoniyati yo'q.
Manzil bo'yicha uzatishda stekka argumentlar manzillar nusxalari kiritiladi, funksiya esa bu manzillar bo'yicha xotira yacheykalarga kirishni amalga oshiradi va argumentlar dastlabki qiymatlarini o'zgartirishi mumkin:
#include
void f(int i, int* j, int& k);
int main(){
int i = 1, j = 2, k = 3;
cout <<"i j k\n";
cout << i << ' ' << j << ' ' << k <<'\n';
f(i, &j, k);
cout << i << ' ' << j << ' ' << k;
return 0;
}
void f(int i, int* j, int& k){
i++; (*j)++; k++;
}
Dasturlarning oxirgi natijasi:
i j k
1 2 3
1 3 4
Birinchi (i) parametr qiymati bo'yicha uzatiladi. Uning funksiyada o'zgarishi berilgan qiymatga ta'sir etmaydi. Ikkinchi (j) parametr ko'rsatgich yordamida manzilga jo'natiladi, bunda faktik parametr adresini funksiyaga berish uchun adres olish amalidan foydalaniladi. Uning funksiyadagi qiymatini olish uchun qayta nomlash amali talab etiladi. Uchinchi (k) parametr murojaat yordamida manzilga uzatiladi.
Funksiyaga murojaat bo'yicha uzatishda chaqiriqda ko'rsatilgan parametr adresi uzatiladi, funksiya ichida parametrga barcha murojaatlar qayta nomlanadi. Shuning uchun ko'rsatgichlar o'rnida murojaatlardan foydalanish dasturning o'qilishini yaxshilaydi, adres olish va qayta nomlash amallar qo'llash zaruratidan qutqaradi. Qiymat bo'yicha uzatish o'rniga murojaatlardan foydalanish samaraliroq, chunki parametrlarni nusxalashni talab etmaydi, bu esa katta hajmdagi ma'lumotlar strukturalarni uzatishda ahamiyatga ega.
Agar funksiya ichida parametr o'zgarishini man qilish talab qilinsa, const modifikatoridan foydalaniladi:
int f(const char*);
char* t(char* a, const int* b);
Do'stlaringiz bilan baham: |