간단하게 제곱 매크로 하나 만들었는데 결과가 영 엉뚱하게 나와서요. 분명 5의 제곱이면 25여야 하는데요.


#define SQUARE(x) x*x

int r = SQUARE(3+2);
printf("%d\n", r); // 25가 아니라 11


3+2 넣었으니까 5*5=25 나올 줄 알았는데 11이 나옵니다. 손으로 계산해보니 매크로가 그대로 펼쳐지면서 3+2*3+2 가 되고, 곱셈 먼저라서 3+6+2=11 이 되는 것 같긴 한데요.


그래서 이렇게 괄호를 씌워봤습니다.


#define SQ(x) ((x)*(x))


이러니까 25는 잘 나오는데, 그럼 SQ(++x) 같은 걸 넣으면 x가 두 번 증가한다는 얘기도 들었거든요. 매크로 괄호 규칙이랑 이런 부작용까지 어떻게 관리해야 하는지 정리해서 알려주시면 감사하겠습니다.