함수호출 할때.
WatchOut
질문 제목 : 함수호출할때.함수가 호출되기 전에 미리 정의 되어 있지 않은 경우.
질문 내용 :
#include stdio.h int main(void) {
float d;
d = func1(1700, 30.0);
printf(d의 예측값: %f, d의 실제값: %f\n, 1700/30.0, d);
}
func1(int sal, float days) {
printf(days의 예측값: %f, days의 실제값: %f\n, 30.0, days);
days = 30.0;
return sal/days;
}
저걸 실행했을때, MS Visual C++컴파일러에서는 실행결과가
days의 예측값: 30.000000, days의 실제값: 0.000000
d의 예측값: 56.666667, d의 실제값: 56.000000
이렇게 뜹니다.
days의 실제값에 0이 뜨는 이유는 함수가 호출되기 전에 미리 정의되어 있지 않기 때문에 그렇게 뜨는 것이고, d의 실제값이 56.000000인 이유는 함수의 반환형을 명시하지 않았기에 정수형으로 나온 것 같습니다.
함수가 호출되기 전에 미리 정의되어 있지 않아서 그런 결과가 뜬 것이라면 func1이라는 함수가 무엇인지 모르니 컴파일 에러가 뜨거나, 아니면 형식매개변수 days에 실매개변수 30.0이 아닌 0.000000이 복사되었다는 뜻이니깐 sal에도 1700이 복사되지 않아야 하는데 func1함수에서 반환하는 sal/days의 결과를 보면 1700/30.0의 정수형값인 56이 되어 있습니다.
왜 그런걸까요?...
-
한별나라
float 형으로 넣어도 0으로 나오더라구요 ㅇㅅㅇ;;; 유닉스에서는 잘 나온다던데 ㅇㅂ ㅇ;;
-
지희
정확한 이유는 모르겠으나 즉치값을 넘길 때는 실수를 double형으로 처리하는 것으로 보이네요.
float형 변수에 있는 값을 넣으면 원하던 결과가 나올겁니다. -
유희
이클립스에서는 컴파일 에러뜨고, 비쥬얼C에서는 형식매개변수에 실수형만 0으로 복사되네요..ㅇㅂ ㅇ
-
김애교
c에서는 함수에 리턴타입을 명시하지 않으면 반환형을 무조건 int형으로 간주합니다. 그런데 func1함수의 printf문에서 days값이 30.0 이나 30.0f나 0을 출력한다는게 왜그렇죠?ㅋ;;;;
-
엘보어
호출할때 넘긴 30.0을 30.0f로 주어도 0.000000이 뜨는데요...
-
가막새
float형에 실수형 즉치값을 넣으면 자동으로 float형으로 들어가는 것은 이상할 것이 없지 않나요?
-
하예진
func1함수에 있는 printf함수 아래에 days = 30.0; 에서는 float형에 똑같이 double형을 넣었는데도 30.0이 저장되었는데 그 이유는 왜인가요 '??
-
예그리나
func1함수를 호출할떄 넘긴 30.0은 float형이 아닌 double형입니다. 30.0f는 float형입니다.
리틀엔디안 환경에서 double형 30.0의 첫 4 바이트는 0으로 채워져 있습니다.
그래서 days의 실제값이 0으로 출력된 것입니다. (좀더 복잡하게 들어가면 또 다른 조건도 있지만 생략합니다)
func1 함수는 리턴타입이 명시되어 있지 않아서 묵시적으로 int형으로 지정되었습니다. 그래서 sal / days의 결과를 int형으로 형변 -
베이비슈
개초보라 답변할 재주는 없고.. 그냥 신기해서 해봤습니다...
함수의 리턴형을 지정하지 않으면 컴파일시 오류가 나지 않는군요.. 처음 알았습니다.. 음.. 저기 몇개 넣어봣는데요.. 이상하게 float형일때만 0.000000을 출력합니다.. 함수 매개변수를 더블형으로 지정시 30.000000 출력되네요.. 혹시 기본자료형을 타는건가 싶어 int형을 char, short, long로 다 바꿔봣는데도 이상없네요.. 메인함수에서 함수 호출시 30.0이 더블형
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2676182 | 숫자 순서대로 배열하는법 | 권뉴 | 2024-11-24 |
2676152 | 기본적인거 하나 질문드립니다. | 개미 | 2024-11-24 |
2676124 | 함수선언관련 질문이에요~...털썩..수정완료 (2) | 가지 | 2024-11-24 |
2676092 | C언어 책 (2) | 아서 | 2024-11-24 |
2676065 | 웹사이트 또는 메신저 등에서 원하는 텍스트를 검사하는방법?? (1) | 모든 | 2024-11-23 |
2676033 | 배열 기초연습중 발생하는 에러 ㅠㅜ... | Creative | 2024-11-23 |
2676005 | keybd_event 게임 제어 | 영글 | 2024-11-23 |
2675900 | 진짜기본적인질문 | 글길 | 2024-11-22 |
2675845 | 수정좀해주세요ㅠㅠㅠ | 해골 | 2024-11-21 |
2675797 | 병합 정렬 소스 코드 질문입니다. (2) | 도래솔 | 2024-11-21 |
2675771 | 큐의 활용이 정확히 어떻게 되죠?? | 해긴 | 2024-11-21 |
2675745 | 도서관리 프로그램 질문이요 | 도리도리 | 2024-11-20 |
2675717 | 2진수로 변환하는것! (3) | 동생몬 | 2024-11-20 |
2675599 | for문 짝수 출력하는 법 (5) | 널위해 | 2024-11-19 |
2675575 | Linux 게시판이 없어서.. | 첫삥 | 2024-11-19 |
2675545 | 구조체 이용할 때 함수에 자료 넘겨주는 것은 어떻게 해야 하나요? | 아연 | 2024-11-19 |
2675518 | 사각형 가로로 어떻게 반복해서 만드는지좀.. 내용 | 신당 | 2024-11-18 |
2675491 | !느낌표를 입력하는것은 어떻게합니까~~?ㅠㅠ (5) | 사지타리우스 | 2024-11-18 |
2675411 | 파일입출력으로 받아온 파일의 중복문자열을 제거한 뒤 파일출력 | 앨버트 | 2024-11-17 |
2675385 | 링크드리스트 주소록 질문드립니다. (1) | 겨루 | 2024-11-17 |