사전 증가 연산자를 사용하는 동안 매크로 함수의 이상한 동작을 발견했습니다. 나는 매크로로 사전 증가 연산자를 사용하는 것이 바람직하지 않다 알고 있지만 여전히 나는 다음이 코드의 실행 뒤에 이유를 알고 싶습니다 :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을 부여했다.
출력이 왜 이렇게 나오는 지 설명 할 수 있다면 큰 도움이 될 것입니다.
정의되지 않은 동작 – Danh
매크로가하는 일에 대해 OP가 혼동 될 수 있으므로 http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior와 중복되지 않습니다. Sourav Ghosh의 대답). –
안녕하세요 @ Danh 실제로이 질문은 내 시험 중 하나에서 물어 보았습니다. 그러므로 나는 대답을 얻기 위해 어딘가에 있어야한다고 생각했습니다. – user7297996