警告:有符号和无符号整数表达式之间的比较[-Wsign-compare]

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

本文关键字:比较 -Wsign-compare 之间 表达式 符号 无符号整数 警告      更新时间:2023-10-16

当我使用g++编译C++程序时

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

其中CCD_ 1是CCD_。

对于std::vector中的元素进行迭代,我需要处理警告吗?谢谢

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
}

std::vector<T>::size()返回std::vector<T>::size_type,它是一个无符号整数类型。

因此,与表达式i < myvec->size()中的i(类型为int(即,有符号整数((进行比较时,您会理所当然地得到警告,因为您正在将无符号整数与有符号整数进行比较。

收到此警告的原因是,在它们的极值(即最大值和最小值(,无符号整数可能会变得比有符号整数大。编译器会发出警告,以便"询问"/"警告"您是否已考虑到可能因此出现的任何问题。

如果这对你来说不是问题,你可以通过简单的铸造来修改警告。

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

另一种方法是更改myvec0的类型以匹配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) {
  ...
}

101010在比较有符号和无符号整数表达式时已经解释了出现此警告的原因。

尽管如此,我还是想提出另一种解决这一警告的方法。i直接使用size_t而不是int

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;
// [...]