2011-10-07 3 views
2
#include<stdio.h> 
#include<conio.h> 
#define square(v) v*v 
void main() 
{ 
int p=3; 
int s=square(++p); 
printf("%d %d",s,p); 
getch(); 
} 

출력 왜 16이 출력으로 나오지 않습니까? (사전 감사)# 이상한

+0

를 참조하십시오 인라인 사용할 수 있습니다 컴파일러에 따라 달라집니다 해결 방법은 http://stackoverflow.com/questions/3605005/evaluate-macro-parameter-once-only를 참조하십시오. – Cascabel

답변

12

매크로는 기본적으로 텍스트 복사하여 붙여 넣기입니다. 그러므로 ++이 복제 중입니다. 매크로의 위험이다

s = ++p * ++p; 

:

매크로

는로 확장되고있다. (이 경우, 또한 정의되지 않은 동작을 호출)

+1

+1이 UB를 호출한다는 것을 알리기 위해 +1 –

+1

호기심에서이 문제에 대해 정의되지 않은 것은 무엇입니까? – MGZero

+2

동일한 변수에 같은 문장에 두 개의 '++'가 있습니다. 그것은 정의되지 않았습니다. – Mysticial

3

++p * ++p 

의 동작이 정의되지, 그것은

대신

inline int square(int p) { 
    return p * p; 
}