2011-03-23 2 views
9

이 C 프로그램의 결과를 설명해 주시겠습니까? 나는 float을 밀고 있지만 int을 읽고 있기 때문에 문제가 printf("%d\n",t); 함수 호출 중 손상된 스택과 같다고 추측합니다. 나는 잘 모르겠다.C 프로그램의 예상치 못한 결과

#include <stdio.h> 

int main() 
{ 
    long x; 
    float t; 
    scanf("%f",&t); 
    printf("%d\n",t); 
    x=30; 
    printf("%f\n",x); 
    { 
     x=9; 
     printf("%f\n",x); 
     { 
      x=10; 
      printf("%f\n",x); 
     } 
     printf("%f\n",x); 
    } 
    x==9; 
    printf("%f\n",x); 

} 

그리고 출력 당신은 긴 인쇄 잘못된 형식 지정자를 사용하는

$ ./a.out 
20.39 
0 
20.389999 
20.389999 
20.389999 
20.389999 
20.389999 
$ 
+2

더 많은 컴파일러 경고를 사용하여 코드를 컴파일해야하며 (SO에 코드를 게시하기 전에) 사용자에게주는 경고에주의해야합니다. –

+1

@Jonathan Leffler : Q를 읽으면서 그는 잘못하고 있지만 실제로 무슨 일이 일어나는지 알고 싶습니다. 그는 더 명시 적이어야하고 컴파일러/플랫폼 정보를 포함해야했습니다. – Erik

답변

1

. 형식 지정자 %ld을 대신 사용하십시오. Results

printf("%f\n",x); 
    //^change this to %ld 
+0

내가 잘못 알고, 출력에 대한 설명을 부탁했습니다. 어쨌든 고맙습니다. – svpranay

+0

잘못된 형식 지정자를 사용하면 @Prasoon 견적이 표준에서 언급 한 내용으로 이어질 수 있습니다. 따라서 결과. – Mahesh

9

무슨 일 당신이 먼저 당신의 printf하는 int을 보낼 예정을 알려 ... 컴파일러에게 거짓말을한다는 것입니다하지만 당신은 대신 float를 보내, 다음은 당신이가는 그에게 double을 보내고 대신 long을 보냅니다.

그렇게하지 마십시오. 컴파일러에게 거짓말하지 마십시오.

정의되지 않은 동작을 호출했습니다. 아무거나 일어날 수있다. 프로그램이 스택을 손상시킬 수 있습니다. 그것은 당신이 기대하는 것을 출력 할 수 있습니다. 레몬 주스가 USB 포트에서 나올 수 있습니다. 그것은 demons fly out of your nose를 만들지도 모른다; ...

0

printf("%d\n",t);

의 printf에 잘못된 형식 지정자를 사용하여 정의되지 않은 동작을 호출합니다.

C99를 인쇄 floatdouble%ld 인쇄에 사용 %f 명확하게 변환 규격이 유효하지 않은 경우 (WRT printffprintf)

가, 행동이 운데 ​​Fi를 네드 있다고 말했습니다. 인수가 이고 해당 변환 지정에 대해 올바른 유형이 아니면 동작은 정의되지 않은 입니다. 실제로 어떻게됩니까

1

은 다음과 같습니다

  • 귀하의 float

    4 바이트, 당신의 long 4 바이트, 당신의 double 8 바이트입니다.
  • float을 줄임표로 전달하면 double으로 변환됩니다. 스택에 8 바이트.
  • long을 줄임표로 - 4 바이트를 스택에 전달합니다.
  • printf은 스택의 8 바이트 (float 지정자)를 double으로 구문 분석합니다. 이 double은 스택에있는 이전 double의 "중요한"부분과 최하위 부분 (사용자의 long)에 약간의 변형으로 구성됩니다.
  • 기본값 %f 출력이 값을 자르므로 변형을 볼 수 없습니다.

%f을 예 : longdouble에 미치는 영향을 확인하십시오.

+0

AMD64에서 처음 8 개의 'float' 인수는 SSE 레지스터를 통해 전달되므로'long '은 일부만 덮어 쓰지 않습니다. – aaz

+0

@aaz : 동작이 x86과 일치하므로 나쁜 일을하고 가정합니다. – Erik

+0

- AMD64와 일치하므로 가정 할 수도 있습니다. '% .20f' 결과는 다를 수 있습니다. – aaz

관련 문제