지역변수 & 전역변수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | int a; // 전역변수 int main() { int a = 100; // 지역변수 aa(); bb(); printf("Main 함수 내의 a 는 %d 입니다\n",a); } void aa() { int a = 10; //지역변수 a++; printf("aa 함수 내의 a 는 %d 입니다\n",a); } void bb() { printf("bb 함수 내의 a 는 %d 입니다\n",a); } | cs |
함수내부에서 어떠한 변수에 대한 연산이 진행될 때
전역변수와 지역변수가 둘다 정의가 되어있다면 자신과 가장 가까이에 있는
지역변수를 이용하여 연산을 진행하며
전역변수만 존재하고 지역변수가 존재하지 않는다면 전역변수의 값을 가지고 연산을 진행한다.
저는 평소 지역변수와 전역변수간에 변수 사용시
항상
자신 또는 자신의 가장 근처 또는
자신 또는 자신을 감싸고 있는 것들의 가장 가까운 곳 또는
조금더 들어가서 코드를 그림처럼 그렸을 때 자신을 감싸고 있는 것들중 가장 가까운 곳...
이라고 생각합니다. 약간 어렵다면
코드의 예시를 들어
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int a = 10; int main() { int a = 20; int i; int j; for(i = 0; i < 1; i++) { for(j = 0; j < 1; j++) { int a = 30; printf("%d\n", a); } } } | cs |
아마 저는 이런식으로 그릴 것 같습니다.
위 그림과 같이된다면.. 우리는 실행중인
printf("%d\n", a);를 감싸고있는 안쪽 for문을 확인하게됩니다.
하지만 우리는 a를 발견할수 없으므로 그 밖에있는 for문을 확인하게 되며
또한 이때 역시도 a가 존재하지 않으므로 main을 확인하게 됩니다.
이때 main 에는 int a = 20; 이라는 선언이 되어있으므로
우리는 이 a를 사용하여
printf("%d\n", a);를 실행시 20이라는 출력값을 얻게됩니다..
만약 여기서도 a가 사라진다면 어떻게 될까요?
우리는 이 a를 사용하여
printf("%d\n", a);를 실행시 10이라는 출력값을 얻게 됩니다.
만약 여기서도 a가 사라진다?..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | int a; // 전역변수 int main() { int a = 100; // 지역변수 aa(); bb(); printf("Main 함수 내의 a 는 %d 입니다\n",a); } void aa() { int a = 10; //지역변수 a++; printf("aa 함수 내의 a 는 %d 입니다\n",a); } void bb() { printf("bb 함수 내의 a 는 %d 입니다\n",a); } | cs |
위와 같이 따로따로 그려주어야 하며 main에 있는 a와 관계없이
aa내부의 a를 확인하며
bb같은 경우에는 a를 출력해야하지만 내부에 a가 없으므로
main을 확인하는 것이 아닌 전역변수 저장구역에 있는 a를 확인하여 들고와야합니다!!
설명이 많이 부족한것 같지만..ㅠ 혹시나 도움이 되길바라며 이렇게 끄적여봅니다.
혹시 틀렸다면.. 피드백 부탁드립니다!
'Dev > [C]' 카테고리의 다른 글
[개탱][Call By Value][Call By reference] (0) | 2018.01.02 |
---|---|
[개탱][C][전처리(preprocessor directives)][헤더파일 중복선언 방지] (0) | 2018.01.02 |
[개탱][C][변수 읽는법][Pointer][Double Pointer][함수 포인터][더블 포인터][포인터] (0) | 2018.01.02 |
[개탱][C][분리 컴파일[Separate compilation]] (0) | 2018.01.02 |
[개탱][C][typedef][Typedef Struct ][사용자 정의 구조체] (0) | 2018.01.02 |