2016-11-02 5 views
1

나는 이것에 대해 매우 혼란 해요매크로와 유사한 기능 반환 다른 결과

printf("%d",prod(1+2,3+4)); 

을하지만 함수로 prod(x,y)를 사용할 때 x*y을 반환하면 21을 반환합니다. 결과가 다른 이유는 무엇입니까? 나는 #defineprod(x,y) = x*y를 주어야한다고 생각했다.

+2

간단한 수학. '1 + 2 * 3 + 4'는 11입니다. 정의는 함수가 아니며 간단한 텍스트 대체입니다. – tkausl

+0

모든 반은 괜찮은 C 책에는 이와 같은 예제가 있으며 작동하지 않는 이유와 괄호로 수정하는 방법이 설명되어 있습니다. – Lundin

+0

[매크로 대 함수를 사용할 때 다른 결과를 얻는 이유는 무엇입니까?] (http://stackoverflow.com/questions/20182897/why-do-i-get-different-results-when-using-a 함수 대 매크로) –

답변

2

운영자 우선 순위가 당신을 물고 있습니다.

#define prod(x,y) x*y 

라인

printf("%d",prod(1+2,3+4)); 

함께

*+보다 높은 우선 순위를 가지고

printf("%d",1+2*3+4); 

참고로 확장 얻는다 그래서 이것은 1 + (2 * 3) + 4 또는 11으로 평가된다.

해결 방법 : #define에 괄호로

Surrround 매개 변수 :

#define prod(x,y) ((x)*(y)) 

이 라인은 지금까지 확장됩니다

printf("%d",((1+2)*(3+4))); 

의 추가 설정의 목적 전체 표현식의 괄호는 결합으로 사용될 때 원하는대로 표현식을 작성하는 것입니다. n은 평가 순서가 중요한 연산자입니다.

prod(4,3)/prod(1,2))((4)*(3))/((1)*(2)) 또는 6으로 확장됩니다. 바깥 괄호가 없으면 확장은 (4)*(3)/(1)*(2) 또는 24이됩니다.

#define prod(x,y) x*y 

라인

printf("%d",prod(1+2,3+4)); 

의 당신의 정의와

1

매크로에 따르면 prod(1+2,3+4)1+2*3+4으로 확장되어 11과 같습니다. 괄호를 사용하여 문제를 해결하십시오.

#define prod(x, y) ((x)*(y)) 
1

printf("%d",1+2*3+4); 

어떤

printf("%d",1+6+4); 
로 평가됩니다된다

11 

함수를 산출

은 사물을 다르게 평가한다. 기능

int prod(int x, int y) { return x*y; } 

printf("%d",prod(1+2,3+4)); 

그들이 전달되기 전에 매개 변수를 축소 (평가) 할 것이다 전화로. 이것은 C가 매개 변수 처리 스타일에서 "값으로 전달"하기 때문입니다. 기술적으로 참조되는 포인터조차도 참조를 나타내는 값으로 바뀌고 그 값은 전달됩니다. 그래서 호출은 함수 내에서

return 3*7; 

또는 반환 21

여기 우아하고 교통이 교훈이있다된다

printf("%d",prod(3,7)); 

을 줄일 수 있습니다. 매크로가 언어를 이해하지 못합니다. 그들은 텍스트 대체 일 뿐이며 유형, 운영자 우선 순위 또는 다른 언어 요소를 존중하지 않습니다. 기본적으로 매크로 언어는 C 언어와 다른 언어이며 C 언어보다 훨씬 원시적 인 언어입니다.