![](/img/trans.png)
[英]warning: comparison between signed and unsigned integer expressions [-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++ ){
^
其中myvec
是std::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.