나는 이것에 대해 매우 혼란 해요매크로와 유사한 기능 반환 다른 결과
printf("%d",prod(1+2,3+4));
을하지만 함수로 prod(x,y)
를 사용할 때 x*y
을 반환하면 21을 반환합니다. 결과가 다른 이유는 무엇입니까? 나는 #define
가 prod(x,y) = x*y
를 주어야한다고 생각했다.
나는 이것에 대해 매우 혼란 해요매크로와 유사한 기능 반환 다른 결과
printf("%d",prod(1+2,3+4));
을하지만 함수로 prod(x,y)
를 사용할 때 x*y
을 반환하면 21을 반환합니다. 결과가 다른 이유는 무엇입니까? 나는 #define
가 prod(x,y) = x*y
를 주어야한다고 생각했다.
운영자 우선 순위가 당신을 물고 있습니다.
#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));
의 당신의 정의와
매크로에 따르면 prod(1+2,3+4)
은 1+2*3+4
으로 확장되어 11
과 같습니다. 괄호를 사용하여 문제를 해결하십시오.
#define prod(x, y) ((x)*(y))
는
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 언어보다 훨씬 원시적 인 언어입니다.
간단한 수학. '1 + 2 * 3 + 4'는 11입니다. 정의는 함수가 아니며 간단한 텍스트 대체입니다. – tkausl
모든 반은 괜찮은 C 책에는 이와 같은 예제가 있으며 작동하지 않는 이유와 괄호로 수정하는 방법이 설명되어 있습니다. – Lundin
[매크로 대 함수를 사용할 때 다른 결과를 얻는 이유는 무엇입니까?] (http://stackoverflow.com/questions/20182897/why-do-i-get-different-results-when-using-a 함수 대 매크로) –