#define 매크로 - 사소한 문제
지금까지 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 매크로를 쓰는 것은 치환부터 시작한다는 것을 기억합시다.
'공부 > c++(c, STL)' 카테고리의 다른 글
[코딩문제]놀이공원 인형 맞추기 (0) | 2016.11.01 |
---|---|
cout 출력 컨트롤 - fixed, scientific, hexfloat, defaultfloat (0) | 2016.10.05 |
퀵정렬(quick sort) (0) | 2016.08.02 |
[STL]벡터(vector) 심화 - erase(), resize()로 인한 원소 처리 (0) | 2016.07.19 |
[STL]벡터(vector)의 메모리 재할당에 대해 (0) | 2016.07.18 |