2014-10-08 6 views
3

저는 2 개의 실수 값 가운데를 반환하는 간단한 함수를 C에서 작성했습니다.C에서 함수를 쓸 때 float 값을 반환했습니다

내 기능은 다음과 같습니다

float mid(float a, float b) { 
     return (a + b)*0.5; 
} 

문제는이 기능이 항상 0.000000을 생산하는 것입니다.

printf("%f", mid(2,5)) 

이 값은 0.000000으로 인쇄됩니다.

하지만, 난 그냥 할 경우 :

printf("%f", (2+5)*0.5) 

이 정확한지, 3.5을 인쇄 할 수 있습니다.

이 문제를 어떻게 해결합니까?

+0

전체 코드를 게시 할 수 있습니까? 같은 CU에 정의 된 함수였습니까? – tristan

+2

질문을 업데이트하여 문제를 보여주는 완전한 자체 프로그램을 제시하십시오. 읽기 : http://sscce.org/. 귀하의 기능은 괜찮아 보입니다. 나는 문제가 무엇인지에 관해서 직감을 가지고있다. 그러나 그것을 명백하게하기 위해 자급 자족 프로그램을 취할 것이다. –

+1

잘 작동합니다! 프로그램을 실행하면 3.5가 인쇄됩니다. Mayby 코드가 도움이 될 것입니다. 또한 이것을 시도해보십시오 : printf ("% f", mid (2.0, 5.0)); – Rizier123

답변

8

기능이 정상입니다. 예를 들어,이 작은 발췌 문장은 올바르게 출력됩니다.

#include <stdio.h> 
#include <string.h> 

float mid(float a, float b);  //declaration here 

int main(void) 
{ 
    printf("%f\n", mid(2,5)); 
    return 0; 
} 
float mid(float a, float b) { 
     return (a + b)*0.5; 
} 

당신이 가지고있는 가능성이 문제는 내가 그랬던 것처럼 당신이 mid()의 선언을 추가하지 않았다, 그리고 컴파일러는 문제를 일으키는 암시 int 반환 생각했다.

+0

+1 "...과 경고를 무시했습니다."함수의 암시 적 선언은 "int"또는 유사한 언어를 증상의 목록에 반환합니다. – WhozCraig

+0

동의 할 수 있습니다. "C에서 반환 값은 기본적으로 int입니다."또한 위의 종류의 함수 선언 (본문이없는 종류, 소스 파일 시작 부분에 배치)은 * prototype * 또는 * function prototype *이라고합니다. * 항상 * 프로그램에 포함 된 모든 함수의 프로토 타입을 포함하십시오. – Will

+0

@Will : 현대 C (ISO C99 이상)에서 반환 값은 기본적으로 int가 아닙니다 –

2

이렇게하면됩니다. 하지만 명시 적으로 double 값을 전달하는 것이 좋습니다.

#include <stdio.h> 
float mid(float a, float b); 

int main() { 

    printf("%f", mid(2.0, 5.0)); 

    return(0); 

} 

float mid(float a, float b) { 
     return (a + b)*0.5; 
} 
+1

당신도 알고 있듯이, 당신도 부유물을 지나치지 않습니다. 당신은 복식을 전달합니다. –

+1

@sharth 동의하지만, 합리적인 능력을 갖춘 사람은'2.0, 5.0' _at 컴파일 시간을 '2.0f, 5.0f'. 생성 된 코드 차이가'mid (2.0f, 5.0f)'로 작성되었다고 기대하지 않을 것입니다. 예,'mid()'의 결과는'double'으로 변환되어'printf()'에 전달 될 수 있습니다. 그러면 print 목적으로'float'으로 변환됩니다. 일부 컴파일러는 상수 형식을 검사하고'mid()'결과 ->'double' ->'print float'을 건너 뛰고'mid()'result ->'print float'을 간단히 수행 할 수 있습니다. – chux

+0

@chux : 원래의 대답은 변수를 실수로 전달하는 것이 좋습니다 _better_. 나는 리 지어가 실제로 자신의 조언을 따르고 있지 않다는 것을 지적했다. 즉, 나는 대부분 동의한다. 필자는 합리적인 컴파일러가이 전체 코드를 다음과 같이 변환 할 것으로 기대한다.'printf ("% f", 3.5f);' –

관련 문제