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