backup/c,c++

열혈강의 C 4일차

nuKeguyS 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)을 반환
    한다고 하는데 확인은 해 봐야겠다.