midas+son의 크리에이티브(creative) 이야기

지금까지 c++에서 define을 매크로로 사용하지 않고

특정 값 지정만 해서 사용하니까 몰랐던 사실을 이제야 알게 되었습니다.

저 나름 신박했던 것이어서 기억하고자 적어봅니다.


#include <iostream>

#define ff(x) x*x

using namespace std;

void main()

{

int k = 3;

cout << ff(k + 1);

}

ff라는 매크로를 만들고 출력하고자 합니다.

위의 출력 값을 예측 하신다면 뭐라고 생각하시나요?


저는 처음엔 머리로 16 이라고 예상 했었습니다.

3+1은 4이고 4 * 4 가 될 것이라고 생각을 했던 것이지요.


하지만 아닙니다.

결과는 7이 나옵니다.


왜 그럴까 생각을 해봅시다.

혼자 생각해서 쉽게 감을 잡을 수 없다면

우리의 멋진 선생님 MSDN을 찾아 봅시다.

https://msdn.microsoft.com/ko-kr/library/teas0593.aspx


요약 하면 이렇습니다.

#define으로 만들어 놓은 것은 치환 먼저 하고 계산을 한다는 것이죠.

즉 k+1 한 것이 계산 되어서 ff에 들어가는 것이 아니라

k+1 자체가 들어가서 x와 치환되어

k + 1 * k + 1 이 되고

k는 3이니까 3 + 1 * 3 + 1 이 되며

곱셈 먼저 하니 3 + 3 + 1이 되어  결과가 7이 나온 것입니다.


일반 함수처럼 임시 변수에 4로 계산되어 들어가지 않는다는 것이 센세이션이었습니다.

의도대로 제곱을 하고자 한다면

#include <iostream>

#define ff(x) (x)*(x)

using namespace std;

void main()

{

int k = 3;

cout << ff(k + 1);

}

위와 같이 x * x 가 (x)*(x)이 되어야 합니다.

그래야 k+1을 넣었을 때에도

(k+1)*(k+1) 로 원하는 제곱이 됩니다.


이상 입니다.

define 매크로를 쓰는 것은 치환부터 시작한다는 것을 기억합시다.