size_type是unsigned类型

本文通过解决杭电1002题过程中遇到的问题,探讨了C++ STL中string::size_type与int类型在减法运算上的区别。string::size_type为无符号类型,即使减至小于零也不会变为负数,导致可能的死循环问题。

      昨晚做杭电1002题,本以为简单的A+B问题,却也让我发现了一个问题,也算是一种收获吧,记在这里了。

      第一次用STL做的,用string存放那两个大数,提交后通过,却看到编译器上有两个warning,"warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data".
大致意思是说,我用int类型表示string类型的size()函数的返回值,可能导致数据的丢失,因为int类型是可正可负的,而string::size_type是unsigned类型,所以表示正数的话,string::size_type
表示的范围肯定是比int范围要大的。看着下面有两个warning也不是很舒服,我就想把程序改下,就可以把两个可恶的warning去掉了,结果改后出现错误,说我访问了不该访问的内容,囧....

      仔细debug后才知道,这就是int和string::size_type的区别啊,int可以取负值,而string::size_type不管你怎么减,它永远是正值,而我的程序中需要对string::size_type的对象一直减,直到减到它
小于零为止,这很明显就是一个死循环,因为string::size_type的对象不可能小于零。

      写一个简单的程序说明情况:

#include <iostream>
#include 
<vector>
using namespace std;
int main()
{
    vector
<int>::size_type t = 1;
    
while(t >= 0)
        
--t;
    cout
<<t<<endl;
    
return 0;
}

这就是一个死循环,调试跟踪时发现,当t取完0后,再次--t后,t的值是4294967295,程序就会这样一直死循环下去。

      也就是说,虽然C++ Primer中强调,为了避免溢出,保存一个string对象size的最安全的方法就是使用标准库类型string:: size_type(或者说保存一个vector对象最安全的方法就是使用vector<int>::size_type类型),但如果你的程序中需要对size_type类型执行减操作并且要把它减到小于零的话,还是不要管那些可恶的warning了,老老实实用int要更保证些。

转载于:https://www.cnblogs.com/krisdy/archive/2009/04/06/1430290.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值