Hacker News오픈소스 · 도구

C에서 배열을 역순으로 순회하는 올바른 방법

원제 Iterating Backwards in C

100 포인트댓글 63
Key Point

배열 역순 순회는 자주 나타나는 패턴인데, 부호 없는 정수 언더플로우의 미묘한 문제를 다루고 있어 C 개발자가 알아야 할 실용적인 지식입니다.

핵심 요약

  • 배열을 역순으로 순회할 때 많은 개발자가 실수하는 패턴들이 있습니다.
  • 부호 없는 정수(size_t)에서 count-1부터 시작해 i >= 0 조건으로 감소시키는 방식은 작동하지 않습니다.
  • i >= 0은 unsigned 타입에서 항상 참이므로 무한 루프가 되고, count가 0이면 i는 즉시 SIZE_MAX로 언더플로우됩니다.
  • signed 타입(ssize_t)을 사용하는 방법은 작동하지만 문제가 있습니다.
  • POSIX ssize_t는 Windows에서 정의해야 하고, 32비트 타입에서는 승격과 절단 문제가 발생할 수 있습니다.
  • 정답은 후위 감소 연산자를 조건문에 쓰는 것입니다: for(size_t i = count; i--;) 형태입니다.
  • 이 방식에서 후위 감소는 감소 전의 값을 반환하므로, 루프 본문에서 i는 항상 범위 내(최대 count-1)입니다.
  • i가 0에서 감소하면 unsigned 언더플로우로 SIZE_MAX가 되지만, C에서는 unsigned 감싸기가 정의된 동작이므로 문제없습니다.
  • 이 방식은 signed 타입 변환이 필요 없고, 한눈에 역순 루프가 올바르게 구현되었는지 확인 가능합니다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗