Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这种C转换以避免有符号/无符号比较有意义吗? 我正在回顾一个C++项目,并有效地看到以下内容: std::vector<SomeType> objects; //then later int size = (int)objects.size(); for( int i = 0; i < size; ++i ) { process( objects[i] ); }_C++_Visual C++_Stl_Casting - Fatal编程技术网

这种C转换以避免有符号/无符号比较有意义吗? 我正在回顾一个C++项目,并有效地看到以下内容: std::vector<SomeType> objects; //then later int size = (int)objects.size(); for( int i = 0; i < size; ++i ) { process( objects[i] ); }

这种C转换以避免有符号/无符号比较有意义吗? 我正在回顾一个C++项目,并有效地看到以下内容: std::vector<SomeType> objects; //then later int size = (int)objects.size(); for( int i = 0; i < size; ++i ) { process( objects[i] ); },c++,visual-c++,stl,casting,C++,Visual C++,Stl,Casting,因此,作者认为避免编译器警告的最佳方法是将size\u t强制转换为int,从而使编译器关闭 < C++ >是否有其他可能的理智原因? < P>我会说C和C++中C语言的压倒性使用只是使编译器闭嘴,而很少或根本没有努力去理解它告诉你的内容。悲哀,但却是真的。无符号int size=(int)objects.size(); unsigned int size = (int)objects.size(); for( unsigned int i = 0; i < size; ++i ) {

因此,作者认为避免编译器警告的最佳方法是将
size\u t
强制转换为
int
,从而使编译器关闭


< C++ >是否有其他可能的理智原因?

< P>我会说C和C++中C语言的压倒性使用只是使编译器闭嘴,而很少或根本没有努力去理解它告诉你的内容。悲哀,但却是真的。

无符号int size=(int)objects.size();
unsigned int size = (int)objects.size();
for( unsigned int i = 0; i < size; ++i ) {
    process( objects[i] );
}
for(无符号整数i=0;i
不,这可能就是原因。再加上向量可能永远不会太长,以至于有截断大小的风险(app.developer会知道这一点)


而且。。。也许在程序的某些部分,他实际上比较了“size”和其他int类型的东西,因此将size设置为“size\u t”类型将在一个地方修复它,但在其他地方破坏它。

显而易见的答案是使用:

size_t size = objects.size();
for( size_t i = 0; i < size; ++i ) {
    process( objects[i] );
}

什么?为什么不直接使用
size\t
?为什么仍然强制转换为
int
?什么?这更糟糕。size变量的预期类型是size\u t,使用无符号int有什么意义?size\u t可能大于无符号INTNITCK:
size()
返回定义的实现
vector::size\u type
,不一定是
size\u t
。挑剔的挑剔:默认分配器使用
size\u t
作为
size\u类型
。是的,您可以编写
vector::size_type s=v.size()
,但是当您更改
v
的分配器时,您仍然会使用错误的
size\u type
,需要查找并更改用法(但同样,typedefs可以提供帮助)。只要键入def向量类型,使用您的VectorTypeDef::size_类型应始终返回正确的类型。挑剔的挑剔:仅
std::string
使用
allocator::size_类型
作为其
size_类型
std::vector
改为使用“实现定义的无符号整数类型”。@UncleBens^^(吹毛求疵通知程序)在第一个版本中,您再次强制转换为int。@Sharptooth:Oops--我复制了他的代码并打算修复它,但没有成功。谢谢你们指出。很多错误都是琐碎的,在上下文中并没有意义,或者是不可读的。有道理很多人的反应是“闭嘴”。@Jay,那不是真的。大多数错误都是有意义的,应用类型转换几乎总是错误的处理方法。我自己的座右铭是“如果需要演员阵容,那就错了”。
size_t size = objects.size();
for( size_t i = 0; i < size; ++i ) {
    process( objects[i] );
}
typedef std::vector<SomeType>::size_type s_t;
s_t size = objects.size();
for (s_t i=0; i<size; ++i)
    process(objects[i]);
std::foreach(objects.begin(), objects.end(), process);