기타 Hacker News · 2일 전

C 언어 역방향 루프(for문) 짤 때 의외로 다들 틀리는 부분과 정석 코드

핵심 요약
  • C 언어에서 size_t 타입을 사용해 역방향 for 루프를 작성할 때 부호 없는 정수 특성으로 인해 무한 루프나 언더플로우 버그가 흔히 발생합니다.
  • 부호 있는 타입을 쓰면 플랫폼 호환성이나 타입 변환 문제가 생기지만, 후위 감소 연산자를 활용한 'for (size_t i = count; i--;)' 패턴을 쓰면 깔끔하게 해결됩니다.
  • 인덱스 범위 검사와 종료 조건이 부호 변환 없이 안전하게 처리되어 역방향 순회의 가장 정석적인 방법으로 추천됩니다.
요약 C 언어에서 배열이나 버퍼를 역방향으로 순회할 때 의외로 많은 개발자나 LLM(인공지능 모델)이 흔히 저지르는 실수와 이를 깔끔하게 해결하는 루프 작성법이 개발자 커뮤니티에서 주목을 받았습니다. 배열을 앞에서부터 순회할 때는 `for (size_t i = 0; i < count; i++)` 형태로 직관적으로 작성할 수 있지만, 이를 그대로 뒤집어 `for (size_t i = count - 1; i >= 0; i--)`로 작성하면 치명적인 문제가 발생합니다. `size_t`는 부호 없는 정수(unsigned) 타입이기 때문에 `i >= 0` 조건은 항상 참이 되어 무한 루프에 빠지며, `count`가 0일 경우 첫 시작부터 언더플로우가 발생해 `i`가 `SIZE_MAX`가 되어버립니다. 이에 대한 대안으로 `ssize_t` 같은 부호 있는 정수(signed) 타입을 쓰기도 하지만, 이 역시 완전한 해결책이 아닙니다. C 언어의 타입 변환 규칙으로 인해 식 내부에서 예기치 못한 문제가 발생할 수 있고, `ssize_t`는 POSIX 표준이라 윈도우 환경에서는 직접 정의해야 하는 번거로움이 있습니다. 또한 32비트 환경에서의 타입 프로모션이나 잘림(truncation) 문제, 루프 조건문이 직관적이지 않다는 단점도 따릅니다. 글쓴이가 제시한 가장 정석적이면서도 우아한 역방향 순회 패턴은 바로 `for (size_t i = count; i--;)`입니다. 이 방식은 후위 감소 연산자(`i--`)의 특성을 영리하게 활용합니다. 루프의 조건 평가 시점에 `i`의 이전 값을 바탕으로 0인지 검사한 직후 1을 빼기 때문에, 루프 본문 안에서 `i`의 값은 항상 `count - 1`부터 시작해 유효한 인덱스 범위를 안전하게 유지합니다. 검사 시점에 `i`가 0이었다면 루프는 즉시 종료되며, 부호 없는 정수의 래핑 현상은 C 언어 표준에 잘 정의되어 있어 안전합니다. 부호 변환 없이도 단 한 줄로 명확하고 안전하게 역방향 순회를 구현할 수 있어 개발자들 사이에서 널리 추천되고 있습니다.
Sponsored · 광고