簡體   English   中英

警告:有符號和無符號整數表達式之間的比較 [-Wsign-compare]

[英]warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

當我使用 g++ 編譯我的 C++ 程序時

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

其中myvecstd::vector<float>的對象。

為了迭代 std::vector 中的元素,我需要處理警告嗎? 謝謝。

std::vector<T>::size()返回std::vector<T>::size_type ,它是一個無符號整數類型。

因此與比較i在表達i < myvec->size()它的類型的int (即,符號整數),則理所當然地,因為您正在使用一個簽署一個比較無符號整數得到一個警告。

您收到此警告的原因是,在它們的極值(即它們的最大值和最小值)處,無符號整數可能會比它們的有符號整數大。 編譯器發出警告,以便“詢問”/“警告”您是否考慮了因此可能出現的任何問題。

如果這對您來說不是問題,您可以通過簡單地強制轉換來修改警告。

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

另一種方法是更改i的類型以匹配myvec->size()

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

但是請注意, i成為無符號整數類型,如果您在循環中減少它,您可能會得到意想不到的結果(即,它不會得到負值)。

另一種方法,如果您的編譯器支持 C++11,並且您想在不更改向量本身的情況下遍歷向量的元素,則將使用基於范圍的循環作為:

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

我個人最喜歡循環向量的元素是:

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

C++ 中的vector使用size_type來索引元素。 你可以用這個寫for循環:

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

另一種方法是使用迭代器:

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

101010 已經在比較有符號和無符號整數表達式時解釋了此警告的原因

不過,我想提出另一種方法來解決此警告。 它是直接使用size_t而不是int用於i

for (size_t i = 0; i < myvec->size(); i++) {
  // ...
}

stl_vector.h 中, size_type 是 size_t 的類型別名,所以我認為使用它應該是安全的,而不是像 101010 和 KostasRim 建議的那樣編寫std::vector<float>::size_type ,盡管這樣更具表現力: -)

// [...]
typedef size_t size_type;
// [...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM