C 매크로 연산자 우선순위 - sonkoni/Koni-Wiki GitHub Wiki

매크로와 연산자 우선순위

매크로는 치환이다. 이로 인해 C언어 우선순위로 의도하지 않은 결과가 나올 수 있다. 괄호를 팍팍 써서 사용해야 한다

#define MUL(a, b)   a * b         ==>> MUL(1 + 2, 3 + 4)
                                  ==>> 1 + 2 * 3 + 4  대치. 결과는 11
#define MUL(a, b)   ((a) * (b))   ==>> MUL(1 + 2, 3 + 4)
                                  ==>> ((1 + 2) * (3 + 4))  대치. 결과는 21

괄호를 써주면 영향  받아
#define ADD(a, b)   a + b         ==>> ADD(1, 2) * 3
                                  ==>> 1 + 2 * 3   으로 대치. 결과는 7
#define ADD(a, b)   ((a) + (b))   ==>> ADD(1, 2) * 3
                                  ==>> ((1) + (2)) * 3   으로 대치. 결과는 9

연산식이 있는 매크로 변수에 괄호를 안 써주면

#include <stdio.h>

#define MUL(a, b)   a * b
#define ADD(a, b)   a + b

int main(int argc, char *argv[]) {

    int r1 = MUL(1 + 2, 3 + 4);
    int r2 = ADD(1, 2) * 3;
    printf("=> %d, %d\n", r1, r2);

    return 0;
}
// => 11, 7

연산식이 있는 매크로 변수에는 괄호를 넣어야

#include <stdio.h>

#define MUL(a, b)   ((a) * (b))
#define ADD(a, b)   ((a) + (b))

int main(int argc, char *argv[]) {

    int r1 = MUL(1 + 2, 3 + 4);
    int r2 = ADD(1, 2) * 3;
    printf("=> %d, %d\n", r1, r2);

    return 0;
}
// => 21, 9
⚠️ **GitHub.com Fallback** ⚠️