카테고리 없음

[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): 변수의 값이나 연산 결과를 출력할 때 사용합니다.

코드 분석

  1. swap 함수:
    • 이 함수는 a와 b를 선언하고, 서로 값을 교환하는 코드가 있습니다.
    • 하지만 중요한 점은 a와 b는 지역 변수로, 함수 내부에서만 유효합니다. 따라서 이 함수가 실행되어도 main 함수의 변수 a와 b에는 아무런 영향을 미치지 않습니다.
    • swap() 함수는 실행해도 의미가 없고, main의 a와 b 값은 그대로 유지됩니다.
  2. 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 문이 종료됩니다.
  3. 출력
    • 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와는 다른 지역 변수이며, 서로 영향을 주지 않습니다.
  • 만약 함수에서 원래 변수 값을 변경하고 싶다면 포인터를 사용해 메모리 주소를 전달해야 합니다.