
C에서 size_t 인덱스로 배열을 역순 탐색할 때는 for(size_t i = count; i--; ) 형태를 쓰면 부호 있는 인덱스로 변환하지 않고도 범위 안에서 반복할 수 있다.
for(size_t i = count; i--; ){
}
i--는 값을 먼저 조건식에 내놓고 그 뒤에 감소시킨다. 따라서 반복문 본문에서 i는 count - 1부터 0까지의 값을 가지며, 처음 값이 0이면 본문에 들어가지 않는다. 조건식에서 i가 0일 때 부호 없는 정수의 값이 순환하더라도, 그 반복은 종료되므로 문제가 되지 않는다는 설명이다.
반대로 for(size_t i = count - 1; i >= 0; i--)는 i >= 0이 항상 참이고, count가 0이면 i가 SIZE_MAX가 될 수 있다. ssize_t를 쓰는 방식은 부호 있는 인덱스를 사용하면서 C의 형 변환 문제를 일으킬 수 있고, ssize_t가 POSIX 정의라 윈도우에서 직접 정의해야 할 수 있다는 지적도 덧붙였다. 인덱스 형식이 32비트이면 정수 승격 문제가 생기고, 값이 잘리는 문제까지 생길 수 있다.
원문은 이 패턴을 find_last 함수에 적용한다.
_Bool find_last(size_t count, int *haystack,
int needle, size_t *where){
for(size_t i = count; i--; ){
if(haystack[i] == needle){
*where = i;
return 1;
}
}
return 0;
}
부록: 원문 예시
_Bool find_last(size_t count, int *haystack,
int needle, size_t *where);
for(size_t i = 0; i < count; i++){
if(haystack[i] == needle){
*where = i;
return 1;
}
}
return 0;
for(size_t i = count - 1; i >= 0; i--){
}
for(ssize_t i = count - 1; i >= 0; i--){
}
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요