6.20.Qlobal dəyişənlər vasitəsi ilə qiymətlərin funksiyalara ötürülməsi Əgər dəyişən blokun daxilində təsvir olunarsa, onda bu dəyişən lokal dəyişən adlanır və blokdan kənarda yerləşən bloklarda lokal dəyişənlərdən istifadə etmək olmaz. Blok öz işini qurtardıqdan sonra lokal dəyişənlərdəki qiymətlər də saxlanılmır. Əgər dəyişənlər blokdan xaricdə və proqramın mətnində əvvəlcədən təsvir olunarsa belə dəyişənlərə qlobal dəyişənlər deyilir. Qlobal dəyişənlərdən blokların daxilində də istifadə etmək olar. Məsələ,
double x; int fun( ) {int y; …} void main ( ) {float y; …} x-dəyişəni fun və main funksiyalarına nəzərən qlobal dəyişəndir və onların daxilində istifadə oluna bilər. Fun və main funksiyalarının hər ikisi eyni adlı y-dəyişəninə malikdirlər. Bu lokal dəyişənlərin bir-biri ilə əlaqəsi yoxdur və müxtəlif kəmiyyətlərdir. Bu lokal dəyişənlər ancaq x-qlobal dəyişəni vasitəsi ilə bir-biri ilə əlaqələndirilə bilər.
Funksiyalara müraciət zamanı qiymətlərin ötürülməsi həm faktiki parametrlər, həm də qlobal dəyişənlər vasitəsi ilə ola bilər. Aşağıda üç ədəddən ən böyüyünün tapılması proqramı bu mexanizmdən istifadə edərək tərtib edilmişdir.
#include using namespace std; int z; //Qlobal dəyişənin təsvir void max (int x, int y) {if(x>y)z=x; else z=y;} void main ( ) {int a,b,c; cout <<”a=”; cin>>a; cout<<”b=”; cin >>b; cout<<”c=”; cin >>c; max(a,b); max(z,c); cout<<”max=”< } max funksiyasının yerinə yetirilməsinın nəticəsi z-qlobal dəsyişənində qalır. Lokal dəyişənlər z-qlobal dəyişəni vasitəsi ilə əlaqələndirilir. Ona görə də funksiyaya 2-ci dəfə müraciət edən zaman z-qlobal dəyişəni həm arqument, həm də nəticə rolunu oynayır.
6.21.Yaddaş sinifləri Proqramda istifadə olunan hər bir dəyişənə yaddaşda yer ayrılır. Dəyişənlər üçün yaddaşda yer ya kompilyasiya mərhələsində, ya da yerinə yetirilmə mərhələsində ayrılır. Dəyişənlərə ayrılan yaddaşın 5 spesifikatoru müvcuddur:
avtomatik (avto-açar sözü);
xarici (extern-açar sözü);
statik (static-açar sözü);
registr yaddaş (register-açar sözü);
mutable-siniflərlə işləyəndə istifadə olunur.
Qlobal dəyişənə yaddaşın xarici bölümündə yer ayrılır. Bu maqnit diskdə olan xarici yaddaş deyildir. Extern sinfinə malik olan operativ yaddaşdır.
Qlobal dəyişənləri ya blokdan xaricdə və ya blokun daxilində extern sözünün köməyi ilə təsvir etmək lazımdır. Bu hal o zaman istifadə olunur ki, proqram modulu ayrıca faylda yerləşir və ayrıca kompilyasiya olunur.
Tutaq ki, əsas və köməkçi funksiyalar ayrı-ayrı fayllarda yerləşmişdir:
fayl 1: fayl 2: - - - - void func ( ) int var; {extern int var; void main ( ) var=10*var; {var=5; } func ( ); cout < } Burada əsas funksiya ilə koməkçi func funksiyası arasındaki qiymətlərin dəyişməsi var qlobal dəyişəni vasitəsi ilə olur və bu dəyişənə yer kompilyasiya vaxtı yaddaşın xarici bölümündə (extern sinfində) ayrılır.
Blok daxilində elan olunan lokal dəyişənlərə yer bloka müraciət zamanı avtomatik yaddaşda stek prinsipi ilə ayrılır və blokdan çıxan zaman ayrılan yer azad olunur. Bu halda avto-sözü susma prinsipinə görə başa düşülür və yazmaq vacib deyildir. Statik yaddaş blok daxilində lokallaşdırılır, avtomatik yaddaşdan fərqli olaraq blokdan çıxan zaman azad olunmur. Bloka təkrar daxil olan zaman statik dəyişənlər əvvəlki qiymətlərini saxlayırlar. Statik dəyişənlərin təsvirinə aid misal:
f( ) {static int a=10; …} Statik dəyişənlər başlanğıc qiyməti ancaq bir dəfə-bloka daxil olan zaman alırlar. Əgər dəyişənlərə başlanğıc qiymətlər verilməsə, onlar “0”-qiyməti alırlar. Statik dəyişənlərdən adətən bloka daxil olmalarının sayını hesablamaq üçün istifadə edilir.
Registr yaddaş lokal dəyiənlərə ayrılır. Proqramda bütün əməliyyatların yerinə yetirilməsində praktiki olaraq registrlə iştirak edirlər. Registr yaddaşdan istifadə olunmasını kompilyatorlar həll edir.
Aşağıdaki misalda dəyişənlərin təsvirinin müxtəlif üsulları nümayış etdirilmişdir:
int var; //Var xarici(qlobal) dəyişənin təsviri int main ( ) {extern int var; //eyni var-qlobal dəyişənin təsviri …
}
func1 ( ) {extern int var1; //yeni xarici var1- dəyişəni … //xarici var dəyişənini burada istifadə etmək olar }
func2 ( ) {… //Buradan var dəyişəni görünür, var1-görünmür } int var1; //Var1-ın qlobal təsviri func3 ( ) {int var; //Burada var-lokal dəyişəndir //Var1-lokal dəyişəni görünür } func4 ( ) {auto int var1; //Var1-lokal dəyişəndir //Var-qlobal dəyişəni görünür}