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

时间:2016-08-22 14:57:49

标签: c++ stdvector

当我使用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中的元素,我是否需要处理警告?感谢。

3 个答案:

答案 0 :(得分:2)

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) {
  ...
}

答案 1 :(得分:2)

c ++中的

Apple使用vector来索引元素。 您可以使用以下命令编写for循环:

size_type

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

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

答案 2 :(得分:0)

101010 already explained the reason 在比较有符号和无符号整数表达式时出现此警告。

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

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

stl_vector.h 中,size_type 是 size_t 的 type alias,所以我认为使用它应该是安全的,而不是像 101010 和 KostasRim 建议的那样写 std::vector<float>::size_type,尽管那样更有表现力:-)

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