먼저, 아래의 코드를 본다.

#include <stdio.h>

int arr[5] = {1, 2, 3, 4, 5};

#define TOTAL_ELEMENTS (sizeof(arr) / sizeof(arr[0]))

int main() {
    
    int d = -1;
    
    if(d <= TOTAL_ELEMENTS - 2)
        printf("total elements is bigger\n");
    else
        printf("total elements is smaller????\n");
    
    return 0;
}

매크로 함수에서 배열 arr의 원소 개수를 리턴한다. 그리고 조건문에서 음수와 비교한다. 원소 개수가 음수보다 작을 수는 전혀 없다.

 

하지만 결과는 신기하게도 작다.

 

이유는 이렇다. 매크로함수 TOTAL_ELEMENTS 는 unsigned int 데이터 타입을 반환한다. 그럼 조건문에서는 int 와 unsigned int 데이터 타입이 비교되고, int는 unsigned int로 승격된다.

 

결국 음수 -1을 갖는 d가 unsigned int 로 승격될 시 매우 큰 숫자로 바뀌게 된다. 그래서 결국 d가 더 크다고 판별하게 되는 것이다.

 

출처 : 컴파일러 개발자가 들려주는 C 이야기 p.32

'C' 카테고리의 다른 글

Object file..  (0) 2025.01.14
세그먼트  (0) 2023.04.13
array length as parameter  (0) 2022.11.09
parameter 실수  (1) 2022.11.08
variable arg  (1) 2022.10.03

+ Recent posts