[C++] unsigned和signed类型不要混用
2016-07-30 17:16
274 查看
写代码时遇到意外的for循环进入问题:
vector prices;//长度为零的数组
for (int i = 0; i < prices.size() - 1; ++i)
{
//这里会进来
}
换一种写法
vector prices;//长度为零的数组
int iLength = prices.size() - 1;
for (int i = 0; i < iLength; ++i)
{
//这里不会进来
}
感觉很奇怪,调试了一下代码,原因是prices.size()是unsigned int类型的,减一后会变成一个很大的正数,这样for循环就会进去了,而第二种写法: int iLength = prices.size() - 1;相当于把unsigned int转成了int: static_cast<int>(prices.size() - 1),第一种改成: for (int i = 0; i < static_cast<int>(prices.size()
- 1); ++i)就一切正常了。
不过,对于这种遍历数组的操作,下标不应该使用signed类型,很容易引起问题,对于容器使用迭代器是比较好的选择。
vector prices;//长度为零的数组
for (int i = 0; i < prices.size() - 1; ++i)
{
//这里会进来
}
换一种写法
vector prices;//长度为零的数组
int iLength = prices.size() - 1;
for (int i = 0; i < iLength; ++i)
{
//这里不会进来
}
感觉很奇怪,调试了一下代码,原因是prices.size()是unsigned int类型的,减一后会变成一个很大的正数,这样for循环就会进去了,而第二种写法: int iLength = prices.size() - 1;相当于把unsigned int转成了int: static_cast<int>(prices.size() - 1),第一种改成: for (int i = 0; i < static_cast<int>(prices.size()
- 1); ++i)就一切正常了。
不过,对于这种遍历数组的操作,下标不应该使用signed类型,很容易引起问题,对于容器使用迭代器是比较好的选择。
相关文章推荐
- c++基础类型之signed、unsigned的一个细节
- c/c++笔试题——基本数据类型unsigned
- (C语言)signed和unsigned类型转化
- C语言中,unsigned与signed类型转换
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- C语言 unsigned 和 signed 类型相互转换深入理解
- unsigned vs. signed in C/C++
- C/C++之char,short ,long,double,float,int, signed, unsigned
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- C++ 集合内的对象不要父子类混用。
- C++新增数据类型long long ,unsigned long long
- C语言 unsigned 和 signed 类型相互转换深入理解
- char类型默认是signed还是unsigned?
- signed与unsigned类型相加
- C#调用C++的dll时,c++ dll函数接口中尽量不要用bool返回类型
- c++关于signed和unsigned
- unsigned signed类型区分很重要
- 不要对不同类型使用三元运算符[C++]
- C语言 unsigned 和 signed 类型相互转换深入理解
- More Effective C++----(1)指针与引用的区别 & (2)尽量使用C++风格的类型转换 & (3)不要对数组使用多态