c 언어 숫자를 곱해가는 코드 오류 입니다.
조회수 841회
숫자를 곱해서 올라가는 코드 인데요. 아래 코드가 출력은 되는데요. 어디엔가 오류 코드가 있습니다. 어느 부분을 고쳐야 할까요? 코드를 추가하면 안됩니다.
'''코드'''
void one(void);
void two(void);
int times = 0;
void one() { int times = 0;
times++;
printf("one(): ");
printf("one() or two() have been called a total of %d times\n", times);
}
void two() { static int times = 0;
times++;
printf("two(): ");
printf("one() or two() have been called a total of %d times\n", times);
}
int main() {
printf("\n");
one(); // 1 time
one(); // 2 times
two(); // 3 times
one(); // 4 times
two(); // 5 times
two(); // 6 times
one(); // 7 times
one(); // 8 times
two(); // 9 times
printf("\n");
exit(0);
}
'''코드'''
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
결론부터 말하고 보자면..
위 질문 댓글에 gday이 말씀하신 대로 메인문 안의 주석이 출력되어야 한다면 one() 함수의 int times = 0 을 지우고 two() 함수의 static int times = 0 을 삭제하시면 됩니다.
왜 삭제해야하는가?
1. one() 함수
void one() { // int times = 0; times++; printf("one(): "); printf("one() or two() have been called a total of %d times\n", times); }
one() 함수의 int times 는 지역변수로 지역변수와 전역변수의 이름이 같을 때 함수 내부에서는 전역변수인 times를 무시하고 지역변수를 체택합니다.
그렇기 때문에 one()이라는 함수를 호출할 때 마다 times는 0으로 초기화 되고 그 후 ++ 동작이 되기 때문에 int times = 0을 삭제하지 않으면 one() 함수의 결과는 항상 1일 것 입니다.
해서 one()함수내의 int times 선언을 삭제하면 전역변수인 times를 ++ 동작을 수행하게 됩니다.
2. two() 함수
void two() { // static int times = 0; times++; printf("two(): "); printf("one() or two() have been called a total of %d times\n", times); }
static int times는 정적변수로 프로그램이 시작될 때 생성되고 함수의 호출이 끝이 나도 사라지지 않는 변수입니다.
ps.
- 정적변수는 자신이 선언된 소스 파일 안에서만 사용할 수 있고 외부에서는 가져다 쓸 수 없습니다.
- 프로그램이 종료될 때 사라집니다.
정적변수인 동시에 two()함수 안에 선언됨으로 지역변수의 특징을 같이 가지게 됩니다.
따라서, two()함수를 호출하면 프로그램을 실행할 때 생성 되어있던 지역함수 times를 ++하는 작업만 진행하게 되고 함수호출 후에도 정적변수 특성상 times는 소멸되지 않기 때문에 지역변수 times의 값은 계속 증가하는 것 입니다.
해서 선언문 static int times를 지우게 되면 two()함수 역시 전역변수인 times를 ++ 하는 동작을 하는 함수가 되기에 질문의 main() 주석문과 같은 결과가 나오게 됩니다.
댓글 입력