문제

내가 이것 (c ++ 또는 c) 코드를 가지고 있다고 가정합니다.

vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

제대로 된 지 상관 없어요. 중요한 부분은 For-Loop 선언에 있습니다. Compiler는 Size ()가 서명되지 않은 int를 반환하지 않고 서명되지 않은 INT를 반환하기 때문에 이에 대한 서명/부호없는 불일치를 제공합니다. 변화하는 것이 얼마나 중요한가 i 서명되지 않았습니까? 나는 루프 카운터를 습관에서 ints로 선언하지만, 이것이 잠재적 인 오류라면 습관에서 벗어날 수 있도록 강요 할 것입니다.

도움이 되었습니까?

해결책

나는 그것이 매우 중요하다고 말할 것입니다 - 당신은 경고를 오류로 컴파일하고 모든 경고를 해결하기 위해 노력해야합니다. 코드에 이와 같은 문제를 남기면 경고를 무시하는 습관을 가지거나 실제 문제를 나타내는 경고와 같은 잘못된 긍정적 인 긍정적 인 습관을 갖기 쉽습니다.

이 경우,이 특정 오류의 경우, 32 비트 플랫폼에서는 서명되지 않은 사람이 음수 서명 값으로 감싸기 전에 벡터에 20 억 개 이상의 항목이 있어야 할 것입니다. 이와 같은 벡터를 얻으려면 모든 메모리를 소진하므로 서명/서명되지 않은 불일치가 중요 할 수있는 상태로 들어갈 수는 없습니다.

다른 팁

기술적으로 i a vector<int>::size_type. 당신은 사용하는 습관에 빠져야합니다 typedef코드의 S :

typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

이제 우리가 그것을 a로 변경하면 deque, 우리는 한 줄만 변경합니다. Wacky Size_type가있는 커스텀 컨테이너이더라도 모든 것이 잘 될 것이라는 따뜻하고 모호한 느낌을받습니다. 그리고 그것은 많은 가치가 있습니다. 서명되지 않은/서명이 있더라도 서명/부호없는 변환을 사용하는 데있어 까다로운 프로모션 문제가있어 필연적으로 당신을 물기 위해 돌아올 것입니다.

이것은 벡터의 크기가 초과 할 가능성이없는 사건에서 중요 할 수 있습니다. INT_MAX. 벡터의 크기가 서명 된 최대 값보다 큰 경우 int, 그러면 루프가 끝나지 않습니다.

글쎄, 서명 된 정수가 표시가 있기 때문에 중요하므로, 나는 음수 값이 될 수있게 될 수 있습니다. 그러면 아무리 큰 값이 있더라도 여전히 크기 ()보다 적지 않습니다.

11111111 < 10000000

대부분의 예에서는 중요하지 않습니다. 그러나 프로그램이 작동하지 않으면 가장 먼저해야 할 일은 경고가 없는지 확인하는 것입니다.

가능한 한 거의 경고가 있는지 확인하십시오.

위에서 말했듯이 벡터를 사용하십시오 :: size_type; 또는 반복자를 사용하여 벡터를 통해 루프하십시오. 자신의 모든 경고를 오류로 처리하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top