제9장 함수와 변수
9.1 변수의 유효 범위
- 지역변수(local variables) : 함수 안에서 선언하며, 함수 안에서만 유효하다.
- 전역변수(global variables) : 함수 밖에서 선언하며, 파일 내부 및 외부의 함수에서 유효하다.
- 블록변수(block variables) : 블록 안에서 선언하며, 블록 안에서만 유효하다.
- 함수원형변수(prototype variables) : 함수 원형 안에서만 유효하다.
#include <stdio.h>
void print_result(int n); // n = 함수 원형 변수 int sum = 0; // sum = 전역 변수 void main()
{
int n; // n = 지역변수 printf(“Enter a integer : ”);
scanf(“%d”, &n);
for (int i=1; i<=n; i++) { // i = 블록 변수 sum += i;
}
printf_result(n);
}
void print_result(int n) {
printf(“1+2+...+%d = %d\n”, n, sum);
}
9.2 지역 변수
- 값을 넣지 않고 (쓰레기 값을 그대로) 사용하면 오류가 발생한다.
9.3 전역 변수
- 전역변수의 초기값은 0이다. (default)
- 명칭 중복 : 지역변수와 전역변수의 이름이 같으면 지역변수로 사용된다.
9.4 저장 유형 지정자
- auto 변수 : 스택(stack=쌓기)에 할당 (함수가 종료되면 변수가 사라진다) - static 변수 : 힙(heap=더미)에 할당 (프로그램이 종료될 때 변수가 사라진다) - register 변수 : CPU의 레지스터에 할당 (속도가 빠르다)
- extern 변수 : 할당하지 않음 (실제 변수는 다른 파일에 있다)
- volatile [vάlətil] (휘발성) 변수 : 문장을 실행할 때마다 메모리에서 읽는다. (최적화 금지)
(교재 388쪽) 은행 계좌 구현하기
#include <stdio.h>
void save(int amount) {
static long balance = 0;
if (amount >= 0) {
printf(“%d \t\t”, amount);
} else printf(“\t %d \t”, -amount);
balance += amount;
printf(“%d \n”, balance);
}
void main() {
printf(“==========================\n”);
printf(“입금 \t출금\t 잔고\n”);
printf(“==========================\n”);
save(10000);
save(50000);
save(-10000);
save(30000);
printf(“==========================\n”);
}
10000 10000
50000 60000
-10000 50000
30000 80000
9.5 연결
- 무연결 : 지역변수는 외부와 연결을 가지지 않는다.
- 외부 연결 : 전역변수, 함수는 외부(다른 파일)에서 사용할 수 있다.
(외부 파일에서는 extern 지정자를 변수나 함수 이름 앞에 붙여 사용한다.) - 내부 연결 : 전역변수, 함수의 앞에 static을 붙이면 내부 파일에서만 사용할 수 있다.
9.6 저장 유형의 사용 요령
(1) 보통 지역변수를 사용한다.(2) 함수 호출이 끝나도 값을 유지해야 한다면 지역 정적을 사용한다.
(3) 여러 함수에서 공유할 데이터 및 함수는 정적 전역변수로 한다.
(4) 여러 파일에서 공유할 데이터 및 함수는 전역변수로 한다.
9.7 가변 매개변수를 가진 함수
- 가변 매개변수를 가진 함수 : 함수의 매개변수의 수가 가변인 함수 - 가변 매개변수를 사용하는 함수를 만드는 순서
(1) 가변 매개 변수를 사용하는 함수의 원형은 ...을 사용하여 선언한다.
(2) 함수 내부에서 va_start()를 호출한다. 함수의 첫 번째 인수는 매개 변수의 개수를 나타낸다.
(3) va_arg()를 호출할 때마다 인수들이 하나씩 반환된다.
(4) 인수의 개수만큼 va_arg()를 호출한다.
(5) va_end(va_list)를 호출하여 가변 매개 변수 기능을 종료한다.
9.8 순환 호출 (recursive call)
- 수학적 귀납법 : ① n=1일 때 성립한다. ② n일 때 성립하면 n+1일때도 성립한다.
- 팩토리얼 : n! = n * (n-1)!, 0!=1 (교재 397쪽) 팩토리얼을 계산하는 함수
// 반복문을 사용하는 방법 long factorial(int n)
{
int fact = 1;
for (int i=2; i<=n; i++) fact *= i;
return fact;
}
// 순환 호출을 사용하는 방법 long factorial(int n)
{
if (n == 0) return 1;
else return n * factorial(n-1);
}
(교재 404쪽) 하노이 탑 문제
#include <stdio.h>
void hanoi_tower(int n, char from, char tmp, char to) {
if (n == 0) return;
hanoi_tower(n-1, from, to, tmp);
printf(“원판 %d: %c -> %c\n”, n, from, to);
hanoi_tower(n-1, tmp, from, to);
}
void main() {
hanoi_tower(3, ‘A’, ‘B’, ‘C’);
}