警告:有符号和无符号整数表达式之间的比较[-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++ ){
^
其中CCD_ 1是CCD_。
对于std::vector中的元素进行迭代,我需要处理警告吗?谢谢
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) {
...
}
另一种方法是更改myvec
0的类型以匹配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;
// [...]
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 智能指针作为无序映射键,并通过引用进行比较
- 比较if语句中的数组值和int值
- - g++中的wsign -比较警告
- 警告:有符号和无符号整数表达式之间的比较[-Wsign-compare]
- 警告:有符号和无符号整数表达式之间的比较 [-Wsign-compare]