2012-05-18 2 views
0
main(){ 
    printf("%d %d",1234.5); 
} 

: 0 1,083,394,560기본 인수 추진 출력

이 플로트 변수 더블 먼저 %d 0을 표시하고 다른 하나로서 취급된다 기본 인자 프로모션의 경우와는 나머지 4 바이트의 값을 표시 1,083,394,560 익스플로러 .

내 질문은이 프로그램

main() 
{ 
    printf("%f",1234.5); 
} 

이 일 수 있습니다 않는 방법 %d 다음 처음 4 바이트를 읽는 경우입니다 오른쪽 출력. float도 4 바이트이기 때문에 %d처럼 동작해야합니다.

+0

나는 2 의사는 출력을 0 – som

+0

다음 프로그램의 출력을 제공 shud 말하고 의미 : 주() { 의 printf ("% d 개 %의 F"를 4.0,4.0); } 출력 : 0 0.000000 왜 위 출력이 표시되고 있지만 나는 그것이 0이 될 것으로 기대합니다. 4.000000 – som

+0

"4 바이트이기 때문에 동일해야합니다"와 같은 가정을 할 수 없습니다. 일부 호출 규칙은 부동 소수점 인수를 정수/포인터 인수에서 * 다른 위치 *에 넣거나 예상치 못한 방식으로 인수를 채 웁니다. –

답변

1

허? %ffloat이 vararg 인수로 전달 된 것이 더 큰 (double)으로 승격되어 그에 따라 작동한다는 것을 "알 수"있습니다. %d의 코드는 승격 된 부동 소수점 값을 예상해야한다는 것을 알지 못합니다. 그것은 (적절히 승격 된) int을 기대합니다.

+0

다음 프로그램에서 알려 주시면 확인해주십시오 : main() { printf ("% d % f", 4.0,4.0); } 출력은 다음과 같습니다. 0 0.000000 왜? – som

+3

@som : 정의되지 않은 동작입니다. 그 코드에 대해 추론 할 수는 없습니다. – Mat

+0

@som UB이지만, 그것에 대해 생각할 수 있습니다. '4.0, 4.0'은 스택 상에 어떤 표현을 가지고 있습니다 - 그것은 float resp로 '00 00 80 40 00 00 80 40'입니다. '00 00 00 00 00 00 10 40 00 00 00 00 00 00 10 40'을 복식으로 사용합니다. '% d'는 '00 00 00 00 00'을 취하여 '% f'는 '00 00 10 40 00 00 00 00'을 취하고 '5.31017013e-315'이며'% f '의'0.0 '으로 처리됩니다. 산출. – glglgl

1

%f 형식 문자열은 인수 목록에서 double 값을 취해서 인쇄합니다. 접미사가 붙지 않은 부동 소수점 리터럴은 C에서 double s이므로 두 배가 기본 승격 규칙에 의해 승격되거나 다른 방식으로 변경되지 않으므로 두 번째 예제에서는 전혀 문제가 발생하지 않습니다.

첫 번째 예는 정의되지 않은 동작이며, 어떤 일이 발생할 수 있습니다.

C99 §7.19.6.1

포맷 불충분 인수가 있으면 fprintf 함수는 동작이 정의 이다.

[...]

인수가 경우는 해당되지 변환 사양의 정확한 유형은, 동작이 정의 이다.

0

당신은 자신에 의해 귀하의 질문에 대답 : 이것은 부동 소수점 변수는 물론 더블

로 처리됩니다 기본 인수 추진의 경우는

, %f이 기본 인수 추진에 대해 알고 이 아니라 doubles 만 처리합니다.