通常循环变量在循环中会充当数组下标,所以为了保证不出线向下越界,直觉上我们会选择使用unsigned int类型的循环变量。

但在运行下面这段代码的时候,问题出现了。

template <class T> void Adjust(T * arr, const unsigned int i, const unsigned int length){T temp = arr[i];unsigned int k;for (unsigned int j = i * 2 + 1; j < length; j = (k * 2) + 1){if (j + 1 < length)k = (arr[j] > arr[j + 1]) ? j : j + 1;elsek = j;if(arr[k] > temp){arr[(j - 1) / 2] = arr[k];arr[k] = temp;}elsebreak;}
}template <class T> void HeapSort (T * arr, const unsigned int length){for (unsigned int i = (length / 2) - 1; i >= 0; i--){Adjust(arr, i, length);// (length / 2) - 1 == index of maximum non-leaf node.}T temp;for (i = length - 1; i > 0; i--){temp = arr[i];arr[i] = arr[0];arr[0] = temp;Adjust(arr, 0, i);}
}

  

调用HeapSort时,程序无法退出。在刚写完这段程序时,Adjust函数中的下标情况比较混乱,我总以为是Adjust函数中出现了下标向上越界的问题。正当我准备插入一条打印语句,以打印建堆结束后的数组时,我发现,在建堆循环中使用的循环变量unsigned int i(第21行),从建堆过程最后一步时的0,变成了 4294967295(即2^32-1)时,我才意识到,原来Adjust函数没有问题,HeapSort函数的逻辑也没有写错,错的只是循环变量。由于循环变量是无符号整数,所以当它为0时,再减1,就变成了UINT_MAX了。最后,我把这个循环变量改为int类型以后,一切就正常了。

那么,循环变量究竟就应该设定成int还是unsigned int呢?

我认为是这样的,使用unsigned int可以防止下溢,但是因为数组下标总是正的,上溢仍然无法通过编译器来防范。在本例中,循环变量在每次循环结束时减少的情况时,一旦循环变量从0开始减少一个值,那么几乎肯定就会出现上溢了,这个时候循环的逻辑是没有问题的,所以这类错误反而成了最大的麻烦。

另外,我认为使用unsigned int来规范当做数组下标使用的变量是个好习惯,但当用unsigned int与int类型进行比较操作时,则会在编译时产生一些有关类型转换的警告,本着视warning如error的态度,在使用unsigned int做循环变量与数组下标的时候,一定要小心行事。当然,如果压根就不用unsigned int而使用int,则是一个最简单有效的办法。

最终,希望通过使用编译规范来防止运行时错误,本身就是一个不合理的想法。想要避免运行时错误,还是需要靠认真编码、认真调试才是正道。当然,真正一劳永逸的办法,还是直接使用容器。这就是其他的话题了。

转载于:https://www.cnblogs.com/superpig0501/p/3967580.html

循环变量到底应该使用int还是unsigned int?相关推荐

  1. c语言unsigned int 范围,unsigned int 32比特数据范围为-2147

    提到unsigned,大家应该都了解,有朋友问c语言中unsigned什么意思,还有人想问c语言中的unsigned是什么意思,这到底是咋回事?事实上unsigned呢,下面是小编推荐给大家的unsi ...

  2. c语言signed int与unsigned int的运算

    一.C语言的int类型与unsigned int运算的问题 1.signed int 可以简写成int ,unsigned int 一般不做简写. 2.在不同类型的混合运算中,编译器也会自动地转换数据 ...

  3. 编写函数unsigned int reverse_bit(unsigned int value),实现无符号二进制整数在32位机器上的bit位翻转

    编写函数unsigned int reverse_bit(unsigned int value),实现无符号二进制整数在32位机器上的bit位翻转 如: 在32位机器上25这个值包含下列各位: 000 ...

  4. int、unsigned int、float、double 和 char 在内存中存储方式

    2017-12-28 创建人:Ruo_Xiao 实验环境:vs2010.Intel 邮箱:xclsoftware@163.com 2018-01-16 修改人:Ruo_Xiao添加对移位存储的说明. ...

  5. 解决error: inlining failed in call to always_inline ‘int _mm_popcnt_u32(unsigned int)’

    在编译_mm_popcnt_u32函数时遇到如下错误: error: inlining failed in call to always_inline 'int _mm_popcnt_u32(unsi ...

  6. size_t是什么数据类型?为什么要用size_t替代int、unsigned int、unsigned long、unsigned long long

    今天看RXW源码的时候,发现有个代码把for循环的节点定义为size_t类型,我想这个循环才几次啊,你就用size_t,逼装的不错哦!,,那么size_t究竟是嘎哈用的呢?让我们来看看! 别看了,破案 ...

  7. c++ 中关于int,unsigned int , short的关系与应用

    int类型比较特殊,具体的字节数同机器字长和编译器有关.如果要保证移植性,尽量用__int16 __int32 __int64吧 __int16.__int32这种数据类型在所有平台下都分配相同的字节 ...

  8. 蓝桥杯扫盲之int, char, unsigned int, unsigned char的使用

    一.C51常用数据类型 C语言中默认规则:short int 即为int,long int 即为 long,前面若无unsigned符号默认signed型. 0和1每一个所占空间是一位(b),也是单片 ...

  9. 笹山希 java,c语言中unsigned int

    C语言的unsigned int是什么意思? - 百度知道 最佳答案: C语言中unsigned int是无符号整数的意思. 无符号整型(unsigned int): (1)我们都知道整型是4个字节( ...

最新文章

  1. 【django】站点管理
  2. 显式无参数构造函数与默认构造函数
  3. php实现分页mssql,PHP操作mssql数据库类,含分页类[分页类原创]
  4. TCP和UDP的区别(Socket)
  5. php判断字符串里有英文,PHP针对中英文混合字符串长度判断及截取方法示例
  6. SEO策略几个常见现象
  7. 【ZJOI2009】【BZOJ1432】Function(找规律)
  8. 算法设计与分析(第2版)屈婉玲 刘田 张立昂 王捍贫编著 第一章课后习题答案
  9. sql数据库去重语法_数据库去重语句
  10. 英特尔it服务器芯片,intel服务器芯片组驱动程序
  11. vnr光学识别怎么打开_【VNR翻译器下载】Visual Novel Reader(VNR翻译器) v2.0 整合版-开心电玩...
  12. redis SDS介绍
  13. 下一清分日期是几年前_我驾驶证有违章我是在清分之前处理的清分日期过后才交的罚款那我那个分还能不能清零那个分还能不能清零?-免费法律咨询-华律网...
  14. 计算机主板功能是什么,电脑主板的作用是什么_电脑主板作用详细介绍 - 系统家园...
  15. 手把手教你玩转OpenWRT路由器系统,视频教程合集
  16. RuntimeError: Could not find GCC executable.
  17. 百度网盘资源下载加速教学
  18. 3v stm32 供电 晶振起振_32.768kHz晶振不起振的终极解决方法?
  19. 读懂python语言_一文读懂python反射机制
  20. 服务器 ts250是什么系统,ts250服务器恢复系统

热门文章

  1. cocos2d-x-3.x 配置(1)win环境搭建
  2. Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
  3. 为什么道理都懂,课执行力差的现象如此普遍?
  4. HDU 1027 全排列
  5. 卡巴斯基宣布高端静谧岑寂僻静产物PURE
  6. error: #error This file requires compiler and library support for the ISO C++ 2011 standard.
  7. php可以用lucene吗,php – Lucene外国字符问题
  8. c++获取串口设备名称_RTThread PIN设备学习笔记
  9. oracle用户导出和导入用不同的用户名,oracle用exp\imp导出导入,及创建表空间与用户...
  10. sap 分摊分配不产生会计凭证的原因_会计凭证的实际分类及凭证管理应用