2016-08-22 2 views
3

내 C++ 프로그램 ++ myvecstd::vector<float>의 목적은경고 : 서명 부호없는 정수 식의 비교는 [-Wsign-비교]

warning: comparison between signed and unsigned integer expressions [-Wsign-compare] 
     for (int i=0; i< myvec->size(); i++){ 
            ^

을 g을 사용하여 컴파일합니다.

std :: vector의 요소를 반복하는 경우 경고 메시지를 처리해야합니까? 감사.

+3

가능한 중복 :

for(std::vector<float>::size_type i = 0; i < myvec->size(); i++) { //code here } 

또 다른 방법은 반복자를 사용하는 것입니다? 나는 경고를 얻는다. 부호있는 것과 부호없는 정수 표현식의 비교 \ [-Wsign-compare \]] (http://stackoverflow.com/questions/7984955/what-is-wrong-with-my-for-loops-i-getget -warnings-between-signed-and-u) –

+0

가능한 복제본 : "서명 된 것과 서명되지 않은 것의 비교"와 같은 경고를 어떻게 수정할 수 있습니까?]] (http://stackoverflow.com/questions/859943/how-can -i-fix-warnings-like-comparison-signed-and-unsigned) –

답변

2

std::vector<T>::size()은 부호없는 정수 유형 인 std::vector<T>::size_type을 반환합니다. 서명 된 하나 부호없는 정수를 비교하기 때문에 결과적으로 형식 int (즉, 부호있는 정수)이다 발현 i < myvec->size()i과 비교

, 당신은 정당하게 경고를 얻을.

이 경고를받는 이유는 극한값 (즉, 최대 값과 최소값)에서 부호없는 정수가 서명 된 정수보다 커질 수 있기 때문입니다. 컴파일러는이 때문에 발생할 수있는 문제를 고려한 경우 "묻습니다"/ "경고"하기 위해 경고를 표시합니다.

이것이 문제가되지 않는다면 단순히 전송하여 경고를 수정할 수 있습니다.

for(int i(0); i < static_cast<int>(myvec->size()); ++i) { 
    ... 
} 

또 다른 방법은 myvec->size() 일치하도록 i의 유형을 변경하는 것입니다 :

for(std::vector<float>::size_type i(0); i < myvec->size(); ++i) { 
    ... 
} 

마음 그러나 당신이 루프에서 감소하는 경우 i 부호없는 정수 타입이되고 있음 예기치 않은 결과가 발생할 수 있습니다 (즉, 음수 값을 가져 오지 않음).

또 다른 방법은 당신의 컴파일러는 C++ 11을 지원하고 벡터 자체를 변경하지 않고 벡터의 요소를 루프를 원하는 경우, 범위 기반 루프를 사용하는 것입니다 경우 같은 :

for(auto &&e : *myvec) { 
    ... 
} 

내 벡터의 요소를 통해 반복에 대한 개인적으로 좋아는 C의 ++에서

for(int i(0), sz(myvec->size()); i <sz; ++i) { 
    ... 
} 
+0

감사합니다. 내 코드로 인해 잠재적 인 문제가 발생할 수 있습니까? – Tim

+0

@Tim 올바른 방법은 iterators 또는 size_type을 사용하는 것입니다. – KostasRim

+0

컨테이너가 매우 큰 경우'int'를주의해야합니다.'int'가 오버 플로우 할 수 있습니다. – Galik

2

vector 인덱스에 요소를 size_type를 사용합니다. 이와 루프에 대해 쓸 수 있습니다 : 루프를 들어 내와 [어떤 문제가의

for(auto it = myvec->begin(); it != myvec->end(); ++it) { 
//code here 
} 
관련 문제