GNU/Linux >> Znalost Linux >  >> Linux

Výukový program programování v Linuxu C Část 10 - Variabilní rozsahy

Pokud sledujete naši sérii výukových programů pro programování v jazyce C, měli byste si být vědomi konceptu proměnných. Zatímco jsme diskutovali o základech proměnných, je zde ještě jeden důležitý aspekt související s proměnnými, o kterém zde budeme diskutovat:rozsah proměnných .

Začněme s kódem pro výměnu hodnot, který jsme použili v jednom z našich předchozích tutoriálů:

#include 

void swap (int val1, int val2)
{
int temp =0;

temp =hodnota1;
hodnota1 =hodnota2;
hodnota2 =teplota;

printf("\nVyměněné hodnoty jsou:%d a %d", hodnota1,val2);

}

int main()
{
int a=0, b=0;

printf("Zadejte dvě celá čísla hodnoty\n");

scanf("%d %d",&a,&b);

printf("Zadané hodnoty jsou:%d a %d", a,b);

swap(a,b);

návrat 0;
}

Zde, v tomto kusu kódu, mají proměnné 'val1' a 'val2' lokální rozsah, což znamená, že ožívají, když je zavolána funkce 'swap', a zaniknou, jakmile skončí volání 'swap'. Prostě nemůžete přistupovat k 'val1' a 'val2' před nebo po volání funkce 'swap'. Podobně rozsah proměnných 'a' a 'b' je také lokální - lokální pro funkci 'main'.

Všimněte si, že tyto proměnné lokálního rozsahu jsou také známé jako automatické proměnné.

Nyní, zatímco proměnné s lokálním rozsahem jsou omezeny na blok, ve kterém jsou deklarovány, existuje další typ proměnných, jejichž rozsah je globální. Jak název napovídá, proměnné globálního rozsahu lze použít napříč funkcemi. Například proměnná 'var' je globální celočíselná proměnná a lze ji použít ve funkcích 'main' i 'swap'.

#include 

int var;

void swap (int val1, int val2)
{
int temp =0;

teplota =hodnota1;
hodnota1 =hodnota2;
hodnota2 =teplota;

printf("\nVyměněné hodnoty jsou:%d a % d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Zadejte dvě celočíselné hodnoty\n");

scanf("%d %d",&a,&b);

printf(" Zadané hodnoty jsou:%d a %d", a,b);

swap(a,b);

návrat 0;
}

Ve výchozím nastavení je globálním proměnným přiřazena hodnota '0'. Ale to není případ lokálních proměnných – musíte jim přiřadit hodnotu, když jsou definovány, jinak obsahují nesmyslnou hodnotu. Například v následujícím programu:

#include 

int var;

int main()
{
int a;

printf("Místní proměnná 'a' aktuálně obsahuje:%d", a);

printf("\n Globální proměnná var aktuálně platí:%d", var);


vrátí 0;
}

Existuje vysoká pravděpodobnost, že pro „a“ získáte nenulovou hodnotu. Na druhou stranu 'var' bude na začátku vždy nula.

Pokračujeme, mohou existovat globální a místní proměnné stejného jména? No, odpověď je ano. Dobře, co tedy ve výstupu vytvoří následující část kódu:

#include 

int var =5;

int main()
{
int var =10;

printf("Místní proměnná 'a' aktuálně obsahuje:%d", var);

printf("\n Globální proměnná var aktuálně obsahuje:%d", var);


vrátí 0;
}

No, výstup bude '10' v obou případech. Důvodem je, že lokální proměnná 'var' přepíše globální 'var'. Takže další logickou otázkou je, jak v tomto případě přistupovat ke globálnímu „var“ uvnitř „hlavního“? Bohužel odpověď je NE. Ve skutečnosti byste se při práci s jazykem C neměli dostávat do takových situací.

Dále přichází koncept „externích“ proměnných. Laicky řečeno, použitím klíčového slova 'extern' s jakoukoli deklarací proměnné říkáte kompilátoru, že tato proměnná je již deklarována/definována někde jinde a my ji zde pouze používáme. Například v následující části kódu kompilátor neví, že existuje 'var', když se pokouší zkompilovat příkaz printf uvnitř hlavní funkce.

#include 

int main()
{

printf("\n Globální proměnná var aktuálně platí:%d", var);


návrat 0;
}

int var =5;

Proto se během kompilace zobrazí chyba podobná následující:

main.c:Ve funkci 'main':
main.c:14:58:chyba:'var' nedeklarováno (první použití v této funkci)
printf("\n Globální proměnná var aktuálně drží:%d", var);
^
main.c:14:58:poznámka:každý nedeklarovaný identifikátor je hlášen pouze jednou pro každou funkci, ve které se vyskytuje

Ale pokud zde deklarujete 'var' jako externí, uvidíte, že vše funguje dobře. Je to proto, že se kompilátor nakonec dostane k původní deklaraci 'var'.

#include 

int main()
{
extern int var;

printf("\n Globální proměnná var aktuálně obsahuje:%d", var);


return 0;
}

int var =5;

A získáte správný výstup:

Globální proměnná var aktuálně platí:5

Takže takhle funguje externista. Externí proměnné se často používají, když je váš program/projekt rozdělen do více souborů zdrojového kódu a chcete, řekněme, použít v 'file1', proměnnou definovanou v 'file2'.

A konečně, když diskutujeme o proměnných rozsahech, bylo by lepší, kdybychom zde také diskutovali o „statických“ proměnných. Statické proměnné jsou speciální v tom smyslu, že si zachovávají svou hodnotu i poté, co opustí rozsah. To znamená, že jsou inicializovány pouze jednou, což je poprvé.

static int counter 

Následuje část kódu, která používá statickou proměnnou k počítání, kolikrát byla funkce volána.

#include 

int swap (int hodnota1, int hodnota2)
{
statické počítadlo int =1;
int temp =0;

teplota =hodnota1;
hodnota1 =hodnota2;
hodnota2 =teplota;

printf("\n Funkce volaná %d krát\n" , counter);
counter++;
}

int main()
{
int a=9, b=4;

swap(a,b);
swap(a,b);
swap(a,b);

návrat 0;
}

Zde je výstup:

 Funkce volána 1krát 

Funkce volána 2krát

Funkce volána 3krát

Takže můžete vidět, že proměnná 'counter' si zachovala svou hodnotu i poté, co byla mimo rozsah. Stejně jako globální proměnné mají i statické proměnné výchozí hodnotu '0'.

V tomto tutoriálu jsme diskutovali o několika důležitých konceptech, které se všechny týkají rozsahu proměnných v programovacím jazyce C. Nezapomeňte si vytvořit vlastní programy, abyste lépe pochopili rozdíl mezi externími, statickými, globálními a lokálními proměnnými. A jako vždy, v případě jakýchkoli pochybností nebo dotazů, napište komentář níže.


Linux
  1. C Výukový program programování 4 - Proměnné a paměť

  2. C Výukový program programování Část 3 - Základy proměnných

  3. C Výukový program programování Část 5 - Znakové proměnné

  1. Výukový program programování v Linuxu C Část 9:Řetězce

  2. Výukový program programování Linux C, část 8 – Volání podle hodnoty versus volání podle ukazatele/adresy

  3. Výukový program programování Linux C, část 8 – Volání podle hodnoty versus volání podle ukazatele/adresy

  1. Výukový program programování Linux C, část 8 – Volání podle hodnoty versus volání podle ukazatele/adresy

  2. Linux C výukový program programování část 14 - praktické příklady bitových operátorů

  3. Výukový program programování v Linuxu C Část 12 – Operátory přiřazení a podmíněné výrazy