웹사이트 검색

Linux C 프로그래밍 자습서 10부 - 변수 범위


C 프로그래밍 자습서 시리즈를 따르고 있다면 변수의 개념을 알고 있어야 합니다. 변수의 기본 사항에 대해 논의하는 동안 여기에서 잘 논의되는 변수와 관련된 또 다른 중요한 측면인 변수의 범위가 있습니다.

이전 자습서 중 하나에서 사용한 교환 값 코드부터 시작하겠습니다.

#include <stdio.h>

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

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

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

printf("Enter two integer values\n");

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

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

이 코드 조각에서 변수 val1 및 val2는 로컬 범위를 가집니다. 함수 스왑 호출 전후에 val1 및 val2에 액세스할 수 없습니다. 유사하게, 변수 a와 b의 범위도 지역적입니다 - 함수 main에 지역적입니다.

이러한 로컬 범위 변수는 자동 변수라고도 합니다.

이제 로컬 범위의 변수는 선언된 블록으로 제한되지만 범위가 전역인 또 다른 유형의 변수가 있습니다. 이름에서 알 수 있듯이 전역 범위 변수는 여러 함수에서 사용할 수 있습니다. 예를 들어 변수 var는 전역 정수 변수이며 기본 및 스왑 기능 모두에서 사용할 수 있습니다.

#include <stdio.h>

int var;

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

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

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

printf("Enter two integer values\n");

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

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

기본적으로 값 0은 전역 변수에 할당됩니다. 그러나 지역 변수의 경우는 그렇지 않습니다. 변수가 정의될 때 값을 할당해야 합니다. 그렇지 않으면 가비지 값을 보유하게 됩니다. 예를 들어, 다음 프로그램에서:

#include <stdio.h>

int var;

int main()
{
int a;

printf("Local variable 'a' currently holds: %d", a);

printf("\n Global variable var currently holds: %d", var);


return 0;
}

a에 대해 0이 아닌 값을 얻을 가능성이 높습니다. var 반면에 처음에는 항상 0입니다.

계속해서 같은 이름의 전역 변수와 지역 변수가 있을 수 있습니까? 대답은 '예'입니다. 자, 그러면 다음 코드는 출력에서 무엇을 생성합니까?

#include <stdio.h>

int var = 5;

int main()
{
int var = 10;

printf("Local variable 'a' currently holds: %d", var);

printf("\n Global variable var currently holds: %d", var);


return 0;
}

음, 출력은 두 경우 모두 10이 됩니다. 그 이유는 지역 변수 var가 전역 var보다 우선하기 때문입니다. 이제 다음 논리적 질문은 이 경우 main 내부의 전역 var에 액세스하는 방법입니다. 슬프게도 대답은 '아니오'입니다. 실제로 C 언어로 작업할 때 이와 같은 상황에 처하는 것을 피해야 합니다.

다음은 외부 변수의 개념입니다. 평신도 용어로, 변수 선언과 함께 키워드 extern을 사용하면 컴파일러에게 이 변수가 이미 다른 곳에서 선언/정의되었고 여기서 사용하고 있음을 알리는 것입니다. 예를 들어, 다음 코드 조각에서 컴파일러는 main 함수 내에서 printf 문을 컴파일하려고 할 때 var가 존재한다는 것을 알지 못합니다.

#include <stdio.h>

int main()
{

printf("\n Global variable var currently holds: %d", var);


return 0;
}

int var = 5;

그래서 컴파일 중에 다음과 같은 오류가 발생합니다.

main.c: In function ‘main’:
main.c:14:58: error: ‘var’ undeclared (first use in this function)
printf("\n Global variable var currently holds: %d", var);
^
main.c:14:58: note: each undeclared identifier is reported only once for each function it appears in

그러나 여기에서 var를 extern으로 선언하면 모든 것이 잘 작동하는 것을 볼 수 있습니다. 컴파일러가 결국 원래 var 선언에 도달하기 때문입니다.

#include <stdio.h>

int main()
{
extern int var;

printf("\n Global variable var currently holds: %d", var);


return 0;
}

int var = 5;

그리고 올바른 출력을 얻습니다.

Global variable var currently holds: 5

이것이 extern이 작동하는 방식입니다. 외부 변수는 프로그램/프로젝트가 여러 소스 코드 파일로 분할되고 file2에 정의된 변수인 file1에서 사용하려는 경우에 자주 사용됩니다.

마지막으로 변수 범위에 대해 논의하고 있으므로 여기에서도 정적 변수에 대해 논의하는 것이 좋습니다. 정적 변수는 범위를 벗어난 후에도 값을 유지한다는 점에서 특별합니다. 즉, 첫 번째인 한 번만 초기화됩니다.

static int counter 

다음은 정적 변수를 사용하여 함수가 호출되는 횟수를 계산하는 코드입니다.

#include <stdio.h>

int swap (int val1, int val2)
{
static int counter = 1;
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\n Function called %d times\n", counter);
counter++;
}

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

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

return 0;
}

결과는 다음과 같습니다.

 Function called 1 times 

Function called 2 times

Function called 3 times

보시다시피 변수 카운터는 범위를 벗어난 후에도 값을 유지했습니다. 전역 변수와 마찬가지로 정적 변수도 기본값이 0입니다.

이 자습서에서는 C 프로그래밍 언어의 변수 범위와 관련된 몇 가지 중요한 개념에 대해 설명했습니다. extern, static, global 및 local 변수 간의 차이를 더 잘 이해하기 위해 자신만의 프로그램을 만드는 것을 잊지 마십시오. 그리고 항상 그렇듯이 의심이나 질문이 있는 경우 아래에 의견을 남겨주세요.