다른 답변에는 실제 예제가 없기 때문에 하나를 추가하겠습니다. 내가 (개인적으로) 서명되지 않은 유형을 피하려고하는 이유 중 하나입니다.
표준 size_t를 배열 인덱스로 사용하십시오.
for (size_t i = 0; i < n; ++i)
// do something here;
좋아, 완벽하게 정상이야 그런 다음 어떤 이유로 루프 방향을 변경하기로 결정했습니다.
for (size_t i = n - 1; i >= 0; --i)
// do something here;
그리고 지금은 작동하지 않습니다. int
반복자로 사용하면 아무런 문제가 없습니다. 지난 2 년 동안 이러한 오류가 두 번 나타났습니다. 일단 프로덕션 환경에서 발생하고 디버깅하기가 어려웠습니다.
나를위한 또 다른 이유는 성가신 경고이며, 매번 이런 식으로 글을 쓰게합니다 .
int n = 123; // for some reason n is signed
...
for (size_t i = 0; i < size_t(n); ++i)
이것들은 사소한 것이지만 합산합니다. 부호있는 정수 만 어디에서나 사용하면 코드가 깨끗하다고 생각합니다.
편집 :
물론, 예제는 바보처럼 보이지만 사람들 이이 실수를하는 것을 보았습니다. 그것을 피하는 쉬운 방법이 있다면, 왜 그것을 사용하지 않습니까?
VS2015 또는 GCC로 다음 코드를 컴파일하면 기본 경고 설정 (GCC의 경우 -Wall을 사용하더라도)에 대한 경고가 표시되지 않습니다. GCC에서 이에 대한 경고를 받으려면 -Wextra를 요청해야합니다. 이것이 항상 Wall 및 Wextra로 컴파일해야하고 정적 분석기를 사용해야하는 이유 중 하나이지만, 많은 실제 프로젝트에서 사람들은 그렇게하지 않습니다.
#include <vector>
#include <iostream>
void unsignedTest()
{
std::vector<int> v{ 1, 2 };
for (int i = v.size() - 1; i >= 0; --i)
std::cout << v[i] << std::endl;
for (size_t i = v.size() - 1; i >= 0; --i)
std::cout << v[i] << std::endl;
}
int main()
{
unsignedTest();
return 0;
}