2016-12-14 14 views
0

사전 증가 연산자를 사용하는 동안 매크로 함수의 이상한 동작을 발견했습니다. 나는 매크로로 사전 증가 연산자를 사용하는 것이 바람직하지 않다 알고 있지만 여전히 나는 다음이 코드의 실행 뒤에 이유를 알고 싶습니다 :C에서 매크로 및 이전/이후 증가

#include <stdio.h> 

#define SQR(x) {x*x } 

int main() 
{ 
    int a=4; 
    int b=SQR(a++); 
    int c=SQR(++a); 
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0; 
} 

이의 출력은 다음과 같습니다

20.....64....10240 

첫 번째 값인 b는 20이며, 괜찮습니다. 4 * 5입니다. 그러나 왜 C의 값은 64, 즉 7 * 8 대신에 8 * 8입니까?

그리고 난 그냥 같은 실행의 순서를 교체 :

#include <stdio.h> 

#define SQR(x) {x*x } 

int main() 
{ 
    int a=4; 
    int c=SQR(++a); 
    int b=SQR(a++); 
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0; 
} 

이의 출력은 다음과 같습니다

42.....36....12096 

이상한 그것이 아니다? 사전 증가는 다시 약간의 문제가있었습니다. 그것은 5 * 6 대신에 42 즉 6 * 7을 부여한 후, 포스트 증가는 또한 6 * 7 대신에 오답 36, 즉 6 * 6을 부여했다.

출력이 왜 이렇게 나오는 지 설명 할 수 있다면 큰 도움이 될 것입니다.

+0

정의되지 않은 동작 – Danh

+0

매크로가하는 일에 대해 OP가 혼동 될 수 있으므로 http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior와 중복되지 않습니다. Sourav Ghosh의 대답). –

+0

안녕하세요 @ Danh 실제로이 질문은 내 시험 중 하나에서 물어 보았습니다. 그러므로 나는 대답을 얻기 위해 어딘가에 있어야한다고 생각했습니다. – user7297996

답변

2

매크로 그래서 당신의

a++ * a++ 

같은

SQR(a++) 

뭔가로 확장 코드, int c=SQR(++a);undefined behavior를 호출

int c = ++a*++a;에, 텍스트 교체입니다. 이유를 설명하려면이 부분을 부분으로 작성하십시오.이 잘 작성된 답변을 참조하십시오.

+0

첫 번째 함수에 대해 적어도 atleast 응답을 얻을 수있는 방법이 없습니까? 내 시험 중 하나에있어 – user7297996

+1

@ user7297996 nopes, UB is ... UB. 그게 다야. –

+0

으르렁 거리며 도와 주셔서 감사합니다 – user7297996