카테고리 없음
[C언어] 변수 범위에 대한 이해도 측정
codecodekode
2024. 10. 6. 20:00
다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.
#include
void swap() {
int a = 11;
int b = 19;
int t = a;
a = b;
b = t;
}
int main() {
int a = 11;
int b = 19;
swap();
switch(a) {
case 1:
b += 1;
case 11:
b += 2;
default:
b += 3;
break;
}
printf("%d", a-b);
}
위 문제를 풀기 위해 필요한 C 언어의 주요 개념은 다음과 같습니다
1. 지역 변수 (Local Variable)
- 지역 변수는 함수 내부에서 선언된 변수로, 해당 함수 내에서만 사용 가능합니다.
- swap() 함수에서 선언된 a와 b는 swap 함수 내부의 지역 변수로, main 함수에서 선언된 a와 b와는 전혀 다른 변수입니다. 함수가 호출될 때 swap()에서 a와 b를 서로 교환해도 main 함수의 a와 b에는 영향을 미치지 않습니다.
2. 함수 호출과 변수 범위 (Scope)
- 함수 내에서 선언된 변수는 함수의 범위를 벗어나면 사라집니다.
- swap() 함수가 a와 b를 변경해도, 그 변화는 swap 함수 내에서만 적용되고 main 함수로는 전달되지 않습니다. 즉, swap() 함수가 호출되어도 main 함수의 a와 b는 여전히 11과 19로 남습니다.
3. switch 문과 break 키워드
- switch 문은 변수의 값을 여러 case와 비교하고, 일치하는 경우 해당 case의 코드를 실행합니다.
- switch 문 내에서 break가 없으면, 해당 case 이후의 모든 코드가 연속적으로 실행됩니다. 이를 fall-through라고 합니다.
- 문제에서 switch(a)에서 a가 11일 때, case 11: 이후의 코드와 default:의 코드까지 모두 실행됩니다.
- break 키워드를 사용하면 switch 문을 빠져나오게 됩니다.
4. 조건문 흐름
- switch-case 구조에서는 case에 맞는 블록이 실행된 후 break가 없다면 다음 case나 default 블록이 연달아 실행됩니다.
- 예제에서는 case 11: 이후에 break가 없기 때문에, b += 2;가 실행된 후 default: 블록의 b += 3;까지 실행됩니다.
5. 출력 함수 (printf)
- printf는 C 언어에서 표준 출력에 결과를 출력하는 함수입니다.
- printf("%d", a-b);에서 %d는 정수형 값을 출력하는 데 사용되며, a - b의 결과를 출력합니다.
요약
- 지역 변수: 함수 내에서 선언된 변수는 해당 함수 내부에서만 유효하며, 함수 밖의 변수에 영향을 미치지 않습니다.
- 함수의 변수 범위: 함수 내에서 선언된 변수는 함수 호출이 끝나면 사라집니다.
- switch 문과 break: switch 문에서 break가 없으면 다음 case나 default 코드가 연달아 실행됩니다.
- 조건 흐름 제어: case에서 break가 없으면 fall-through로 인해 그다음 코드가 모두 실행된다는 점.
- 출력 (printf): 변수의 값이나 연산 결과를 출력할 때 사용합니다.
코드 분석
- swap 함수:
- 이 함수는 a와 b를 선언하고, 서로 값을 교환하는 코드가 있습니다.
- 하지만 중요한 점은 a와 b는 지역 변수로, 함수 내부에서만 유효합니다. 따라서 이 함수가 실행되어도 main 함수의 변수 a와 b에는 아무런 영향을 미치지 않습니다.
- swap() 함수는 실행해도 의미가 없고, main의 a와 b 값은 그대로 유지됩니다.
- main 함수
- int a = 11;, int b = 19;로 a와 b를 선언하고 초기화합니다.
- swap() 함수 호출 후에도 a와 b는 여전히 11과 19를 유지합니다.
- switch(a) 문에서 a는 11입니다. 각 case가 어떻게 작동하는지 살펴보겠습니다.
- case 11: : b += 2;가 실행됩니다. 이제 b는 19 + 2 = 21이 됩니다.
- default: : b += 3;가 실행됩니다. 이제 b는 21 + 3 = 24가 됩니다.
- break;가 있기 때문에 switch 문이 종료됩니다.
- 출력
- a는 11, b는 24입니다.
- a - b = 11 - 24 = -13입니다.
- 따라서 출력 결과는 -13입니다.
최종 실행 결과
-13
요약
- swap() 함수는 main 함수의 변수 a와 b에 영향을 주지 않습니다.
- switch 문에서 case 11과 default가 모두 실행되어 b의 값이 24가 됩니다.
- 최종 출력은 a - b = -13입니다.
1. 지역 변수와 스코프 (Scope)
- 지역 변수 (Local Variable) : 변수는 선언된 위치에 따라 범위(Scope)가 결정됩니다.
- 함수 내부에서 선언된 변수는 해당 함수 내에서만 유효하고, 함수가 종료되면 사라집니다. 이를 지역 변수라고 부릅니다.
2. 함수 호출 시 인자 전달 방식
C 언어에서 함수 호출 시 기본적으로 값에 의한 전달 (Call by Value) 방식을 사용합니다. 이것은 변수의 값을 복사해서 함수에 전달하는 것입니다.
3. 예제 코드 분석
- main() 함수에서 a와 b를 선언하고, 값은 11과 19로 초기화합니다.
- swap() 함수가 호출되지만, 이 함수는 main()의 a와 b를 직접 변경하지 않습니다. 왜냐하면 swap() 함수에서 사용되는 a와 b는 그 함수 내부에서만 존재하는 지역 변수이기 때문입니다.
- 따라서 swap() 함수가 실행되어도 main() 함수의 a와 b는 여전히 11과 19로 유지됩니다.
4. 값에 의한 전달을 그림으로 설명
swap() 함수가 호출될 때 :
- swap() 함수 안에서 새로운 변수 a와 b가 생성됩니다. 이것들은 main() 함수의 a와 b와는 다른 메모리 위치를 가집니다.
- swap() 함수가 종료되면, 함수 내부의 a와 b는 메모리에서 사라지고 main() 함수의 a와 b는 여전히 이전 값을 유지합니다.
★ 만약 swap() 함수가 main()의 변수에 영향을 주려면?
- 포인터 (Pointer)를 사용해야 합니다. 포인터를 통해 변수의 메모리 주소를 넘겨주면, 함수 내부에서 원래 변수의 값을 변경할 수 있습니다.
예를 들어:
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
int main() {
int a = 11;
int b = 19;
swap(&a, &b); // a와 b의 주소를 swap 함수에 전달
printf("%d %d", a, b); // 19 11 출력
}
위 코드에서는 포인터를 사용하여 main() 함수의 a와 b 값을 변경할 수 있습니다.
요약
- C 언어에서 함수는 기본적으로 값에 의한 전달을 사용하여, 변수의 값을 복사해서 함수로 전달합니다.
- swap() 함수의 a와 b는 main() 함수의 a와 b와는 다른 지역 변수이며, 서로 영향을 주지 않습니다.
- 만약 함수에서 원래 변수 값을 변경하고 싶다면 포인터를 사용해 메모리 주소를 전달해야 합니다.