
난 여기서 의문이 생겼다.
같은 실수형을 쓰는 데 float는 f를 쓰고 double은 lf를 쓰는 지 그냥 둘다 f를 쓰면 되지 않나?
C언어에서 실수형 데이터를 사용할 때 float와 double 타입이 있으며, 이를 입출력할 때 사용하는 서식 지정자(format specifier)에 혼동이 생기기 쉽다. 특히 printf와 scanf에서의 사용 방식이 다르기 때문에 이를 명확히 이해하는 것이 중요하다.
1. printf에서의 동작
printf 함수에서는 float와 double 모두 %f를 사용해 출력할 수 있다.
float a = 1.23f;
double b = 4.56;
printf("%f\n", a);
printf("%f\n", b);
이것이 가능한 이유는, printf와 같은 가변 인자 함수(varargs function)에서는 "기본 인자 승격(Default Argument Promotion)" 이라는 규칙이 적용되기 때문이다.
이 규칙에 의해:
- float 타입은 자동으로 double로 변환되어 전달된다.
즉, printf로 넘겨지는 순간:
(float)a → (double)a
따라서 float와 double 모두 내부적으로 double로 처리되며, %f 하나로 출력이 가능하다.
2. scanf에서의 동작 (중요)
반면 scanf에서는 float와 double을 구분해서 사용해야 한다.
float a;
double b;
scanf("%f", &a); // float 입력
scanf("%lf", &b); // double 입력
왜냐하면 scanf는 값을 읽어서 변수의 메모리 공간에 직접 저장하는 함수이기 때문이다.
- float → 4바이트
- double → 8바이트
이처럼 크기가 다르기 때문에, 잘못된 형식을 사용하면 메모리를 잘못 건드려 오류가 발생할 수 있다.
예를 들어:
scanf("%f", &b); // ❌ 잘못된 사용
이 경우 double 변수에 float 방식으로 값을 저장하려 하므로 문제가 생길 수 있다.
3. 결론
- printf에서는 float가 자동으로 double로 변환되기 때문에 %f만 사용해도 된다.
- scanf에서는 실제 메모리에 값을 저장해야 하므로 반드시 타입에 맞는 서식 지정자를 사용해야 한다.
- 이 차이는 C언어의 기본 인자 승격 규칙과 메모리 처리 방식의 차이에서 발생한다.
C 언어에서 printf는 가변 인자 함수이기 때문에 float가 double로 자동 승격되며 모두 %f로 출력 가능하지만, scanf는 메모리에 직접 값을 저장하므로 float에는 %f, double에는 %lf를 정확히 구분해서 사용해야 한다.
'c언어' 카테고리의 다른 글
| printf(화면에 값을 출력하는 함수) (0) | 2026.05.30 |
|---|---|
| 상수(변하지 않는 수) (0) | 2026.05.30 |
| 주석 처리하는 방법 (0) | 2026.05.30 |
| 정수형 변수 (0) | 2026.05.30 |
| 언어의 시작 hello world 출력 해보기 (0) | 2026.05.30 |