c 언어 숫자를 곱해가는 코드 오류 입니다.

조회수 396회

숫자를 곱해서 올라가는 코드 인데요. 아래 코드가 출력은 되는데요. 어디엔가 오류 코드가 있습니다. 어느 부분을 고쳐야 할까요? 코드를 추가하면 안됩니다.

'''코드'''

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);

}

'''코드'''

  • 곱해서 올라가는게 무슨말이죠..? 그냥 변수 스코프 공부하는 코드같은데요.. 전대호 2018.2.6 21:16
  • 곱해서 올라간다는 것에 대한 설명이 부족해서 답변 드리기가 어렵네요. 이동근 2018.2.6 23:12
  • 메인문 주석이 결과값을 뜻한다면, one함수와 two함수 내부의 times 선언문을 지워버리세요. gday 2018.2.7 15:03

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.

    1. 정적변수는 자신이 선언된 소스 파일 안에서만 사용할 수 있고 외부에서는 가져다 쓸 수 없습니다.
    2. 프로그램이 종료될 때 사라집니다.

    정적변수인 동시에 two()함수 안에 선언됨으로 지역변수의 특징을 같이 가지게 됩니다.

    따라서, two()함수를 호출하면 프로그램을 실행할 때 생성 되어있던 지역함수 times를 ++하는 작업만 진행하게 되고 함수호출 후에도 정적변수 특성상 times는 소멸되지 않기 때문에 지역변수 times의 값은 계속 증가하는 것 입니다.

    해서 선언문 static int times를 지우게 되면 two()함수 역시 전역변수인 times를 ++ 하는 동작을 하는 함수가 되기에 질문의 main() 주석문과 같은 결과가 나오게 됩니다.

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.