int printf(const char * format, ... ); // 함수 선언
int main(void)
{
printf("%f\n", 3.14F); // 두 번째 인자는 왜 하필 double로 변환?
return 0;
}
가변인자 부분에는 default argument promotion이 발생하는 것으로 알고 있습니다. 때문에 int보다 작은 자료형의 정수형 인자는 int혹은 unsigned int로 변환되어서 전달될 것이고, float보다 작은 자료형의 실수형 인자는 double로 전달될 것입니다. 그런데 이때 double로 변환되는 특별한 이유가 있는건가요?
정수형 인자가 int혹은 unsigned int로 변환되는 이유가 integer promotion
때문이라고 이해할수 있는 반면, 실수형 인자는 왜 하필 double로 변환되는건지 이유가 무척 궁금합니다.
C 언어 표준(6.5.2.2.7)에 따르면 가변 인자의 타입은 승급됩니다.
char, bool, short는 int로, float는 double로 승급됩니다.
초기 C 언어는 함수 원형(prototype)이 없었습니다.
가변인자일 때 호출하는 쪽에서 선언된 함수의 타입을 알 방법이 없어서 이와 같이 정해졌다고 합니다.
감사합니다.
도움주셔서 감사합니다^_^ 조심스럽지만.. 표준에 의해서 float형 인자가 왜 하필 long double도 아니고 double로 승급되는지가 궁금했었습니다. 이러한 내용이 없어서 아쉬웠습니다. 하지만 이와 관련해서 조금 생각을 해보니 쉽게 답?을 구할 수 있어서 제 생각을 달아볼까 합니다. 나쁜 의도는 없으니 좋게 받아 들여주세요^^; 감사합니다.
도움이 될까 싶어서 제 생각을 적어봅니다.
default argument promotion에 의해서 float형 인자가 double로 자동 형 변환되는 이유는 프로그래머가 예측을 쉽게 할 수 있도록(혼란을 줄일 수 있도록) 하기 위함입니다.
왜냐하면 C표준에서 long double이 항상 double보다 값의 표현범위와 정밀도가 커야(높아야) 한다고 명시하고 있지 않기 때문인데요. 이는 프로그래머가 소수점 이하 18자리의 실수형 상수는 항상 long double로 처리될 것이라는 기대(예측)와는 달리 다르게 동작할 수 있음을 의미합니다. 즉 long double이 double 자료형과 동일하게 처리될 수 있음을 뜻합니다.
그러나 double은 float와는 항상 서로 다른 자료형으로 취급되고, 심지어 float로 표현할 수 있는 표현범위와 정밀도 역시 double 자료형으로도 충분합니다. 여기서 무엇보다도 중요한 것은 double이 float의 능력을 포함하고 있으면서 float와는 서로 다른 자료형으로 취급되므로 프로그래머 입장에서는 프로그램이 예측(기대)된 동작을 한다는 것입니다. 그래서 실수형 변수의 자료형과 상수의 자료형 그리고 가변인자 역시 double이 주로 사용되지 않나 싶습니다.