警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 当我用G++编译C++程序时 warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for ( int i=0; i< myvec->size(); i++ ){ ^ 警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 对于(int i=0;isize();i++){ ^
其中警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 当我用G++编译C++程序时 warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for ( int i=0; i< myvec->size(); i++ ){ ^ 警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 对于(int i=0;isize();i++){ ^,c++,stdvector,C++,Stdvector,其中myvec是std::vector的对象 对于在std::vector中迭代元素,我需要处理警告吗?谢谢。std::vector::size()返回无符号整数类型的std::vector::size\u type 因此,与表达式isize()中类型为int(即有符号整数)的i相比,您理所当然地会收到一条警告,因为您正在比较无符号整数和有符号整数 出现此警告的原因是,在其极值(即最大值和最小值)处,无符号整数可能会比有符号整数大。编译器会发出警告,以便“询问”/“警告”您是否考虑了由此可能出现
myvec
是std::vector
的对象
对于在std::vector中迭代元素,我需要处理警告吗?谢谢。std::vector::size()
返回无符号整数类型的std::vector::size\u type
因此,与表达式isize()
中类型为int
(即有符号整数)的i
相比,您理所当然地会收到一条警告,因为您正在比较无符号整数和有符号整数
出现此警告的原因是,在其极值(即最大值和最小值)处,无符号整数可能会比有符号整数大。编译器会发出警告,以便“询问”/“警告”您是否考虑了由此可能出现的任何问题
如果这对你来说不是问题,你可以通过简单的施法来修正警告
for(int i(0); i < static_cast<int>(myvec->size()); ++i) {
...
}
但是请注意,i
将成为无符号整数类型,如果在循环中减少它,则可能会得到意外的结果(即不会得到负值)
另一种方法是,如果您的编译器支持C++11,并且您希望在不更改向量本身的情况下循环向量的元素,则可以使用基于范围的循环,如下所示:
for(auto &&e : *myvec) {
...
}
我个人最喜欢在向量元素上循环:
for(int i(0), sz(myvec->size()); i <sz; ++i) {
...
}
<代码> >(int i(0),sz(MyVEC -> siz());C++中的<< P> <代码>向量< /代码>使用<代码> siZeIZYPE类型< /C> >对元素进行索引。 您可以使用以下命令编写for循环:
for(std::vector<float>::size_type i = 0; i < myvec->size(); i++) {
//code here
}
比较有符号整数表达式和无符号整数表达式时出现此警告
然而,我想提出另一种解决此警告的方法,即直接使用size\u t
而不是int
来表示I
for(size\u t i=0;isize();i++){
// ...
}
In size_type是size_t的缩写,因此我认为使用它应该是安全的,而不必像101010和KostasRim建议的那样编写std::vector::size_type
,尽管这更具表现力:-)
/[…]
typedef size_t size_type;
// [...]
可能重复的@Tim可能重复的正确方法是使用迭代器
或size\u type
必须小心int
如果容器非常大,int
可能溢出。
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
}