1.PNG


2.PNG

댓글의 닉넴과 레벨은 가립니다.


%f와 %lf 얘기가 나오는데 본래 scanf에는 2개가 존재했지만, printf는 1개가 존재하다가 C언어 99년도 표준(C99)에서 %lf가 추가 됐습니다.

사실 printf에서는 %f와 %lf는 내부적으로 처리방식이 같습니다.


학교에서 잘 안가르쳐주는 내용이긴 한데..(학교가 단순히 C언어 배우는곳은 아닙니다.)

그 이유는 표준에 default argument promotions이라는 규칙에 있습니다.


default argument promotions, 우리말로 하자면 기본 인자의 진급이라고도 하는데

가변인자 함수(printf, scanf 등)에 적용되는 규칙으로, 대략 다음과 같습니다.


(고수마법사분들이 많으시니까..) 아시다시피 가변인수는 타입이 정해져있지 않죠. 그래서 편의를 위해 이런 규칙이 생긴겁니다.


1. char, short등의 int이하의 자료형은 모두 int나 그것으로 표현이 안되는 경우엔 unsigned int로 진급한다.

2. float형은 double로 진급한다.

3. default argument promotions가 적용되는 타입의 derived 타입은 진급대상에서 제외된다.

4. 위에 언급된 이외의 타입(포인터 등)은 진급대상에서 제외된다.


즉, printf에서 실수형을 출력하고자 할 때는, %f 하나로도 float와 double을 모두 처리할 수 있습니다. float가 double로 자동 진급하거든요.

나머지 정수타입들도 int보다 사이즈가 작은 것들은 자동으로 int나 unsigned int로 변환이 됩니다.


따라서 본래 printf는 C95에서는 %lf를 지원하지 않았습니다만, C99에서 일관성을 위해서 %lf가 추가되었습니다.

그러나 이전 표준과의 호환을 위해서라면 printf에서의 %lf는 자제하는게 좋죠...


scanf는 인수로 포인터를 받습니다. 따라서 기본 인자 진급과 무관합니다. 그러니 %f와 %lf가 반드시 구분 되어야겠지요.