ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 열혈강의 C 4일차
    backup/c,c++ 2009. 12. 15. 18:06

    간단하지만 알고있으면 좋을 것 같아서 기록한다.

    1. 보통 변수의 선언은 함수초반부에 한번에 한다. 그렇지 않으면 에러가 생기므로...
        하지만 함수 안에 새로운 지역(중괄호)이 존재한다면 그 안에서 새로운 변수를 선언할 수 있다.
        main()
        {
              int i=0;
              if(1)
              {
                    int i=1;
              }

              {
                   int i = 2;
               }
        }
        바로 이런식이다. 새로운 지역이라면 항상 새로운 변수 선언이 가능하다. 단 그 지역의 시작부분에!!
        즉, 변수는 지역의 시작부에 선언해주면 된다!! 는 사실을 알고 있으면 된다. 쉽지만 미처 생각지 못했던 부분이다.

    2. 가변인자함수(Variadic Funcition)
       C++에서는 본 듯 하지만 C에서 가변인자를 받는 함수를 사용할 수 있다는 사실을 처음 깨달았다.
       가변 인자함수란 매개변수의 개수를 정하지 않고 호출시 필요에 따라 인자의 개수를 변화시킬 수 있는 함수이다.
       예를 들면, 우리가 거의 항상 쓰다시피하는 printf() 와 scanf()가 있겠다.
       그동안 너무 당연한 듯이 생각만 했지 매개변수 수가 정해져 있지 않다는 것엔 관심을 갖지 않았다.
       위 두함수의 원형을 보면
       int printf( const char *format, ...);
       int scanf( const char *format, ...);
       이렇게 되었다. 즉, 몇 개의 인자가 전달되건 어떤 종류의 인자가 전달되건 상관없다는 뜻이다.
      
       가변인자함수의 사용
       #include <stdio.h>
       #include <stdarg.h>   -  가변인자함수 사용을 위해 포함해야 하는 헤더파일

       void va_fct(int a, ...);
       int main()
       {
             va_fct(1, 1);
             va_fct(2, 1, 2);
             va_fct(3, 1, 2, 3);       //인자의 개수가 정해져 있지 않은 것을 알 수 있다.
       }   

      void va_fct(int a, ...)
      {
            int i;
            va_list list;                  //list 포인터 선언, 매개변수를 가리키는 포인터라고 생각하면 된다.
            va_start(list, a);           //list 포인터의 초기화, list가 첫번째(a다음의) 인자를 가리키게 한다.
            for(i=0; i<a; i++)
            {
                    printf("%d", va_arg(list, int) );     // va_arg함수를 호출하면서 변수 list를 인자로 전달하고 있다.
                                                                  // 두번째 인자는 가변 인자의 자료형이다.
                                                                  // 호출되고 나면 list는 다음 번 가변인자를 가리키게 된다.
            }
           printf("\n");
           va_end(list)                 //list 리셋, 가변 인자를 모두 참조했다면 반드시 거쳐야 하는 과정이다.
      }

      추가적으로 위의 코드에서 가변인자함수의 첫번째 인자는 전달되는 가변인자의 개수를 의미한다는 것을 알 수 있다.

    ※ printf / scanf 의 반환 값은 무엇일까?
        printf()는 출력한 데이터의 크기를 바이트 값으로 반환해 준다.
        scanf()는 성공적으로 입력받은 문자의 개수를 반환하고 하나도 제대로 입력받지 못한 경우에는 EOF(-1)을 반환
        한다고 하는데 확인은 해 봐야겠다.

Designed by Tistory.