search 登录 注册
arrow_back返回列表
ID:42313
light_modedark_modedark_modedark_modestarstar
Lv.2 独赏二月雪
edit_note帖子 1,551
stars积分 20,071
event加入 2011-05-19
怀旧国机

C语言一个微妙的Bug

schedule发表于 2013-08-25 18:22:00 visibility查看 233 chat_bubble回复 16
#1 楼主
1 #include
  2
  3 int array[] = {23, 24 ,12, 204};
  4 #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
  5
  6 void main()
  7 {
  8 int d = -1;
  9 if(d <= TOTAL_ELEMENTS)
  10 printf(“TRUE\n“);
  11 }
  运行结果是不打印TRUE。
  解释:TOTAL_ELEMENT所定义的值是unsigned int类型,因为sizeof()返回类型是无符号数。if语句在signed int和unsigned int之间测试大小关系,所以d被提升为unsigned int类型。 -1转换成unsigned int 的结果将是一个非常巨大的正整数,导致if判断为假。
  解决方法:可以修改第四行为:#define TOTAL_ELEMENTS (int)(sizeof(array)/sizeof(array[0]))
  建议:
  尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄、国债等)而用它来表示数量。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界的情况(如-1被转化为非常大的正整数)。
  只有在使用位段和二进制掩码的时候,才可以使用无符号数。应该在表达式中使用强制类型转化,是操作数均为有符号数或者无符号数,避免编译器来选择结果的类型。

全部回复 (16)

ID:123695
light_modedark_modedark_modestar
Lv.3 畅意三江水
2013-08-25 18:45:00 沙发
凤飞飞刚刚给很尴尬发过刚才查查vvvvvvvv规划局vv结结巴巴凤飞飞vv那就好过分vv7的
ID:72791
light_modedark_modestar
Lv.1 韶华一笑间
2013-08-25 18:48:00 板凳
就看看
ID:108305
light_modestar
Lv.1 韶华一笑间
2013-08-25 18:57:00 地板
?!?。。。
ID:123307
light_modestarstarstar
Lv.1 韶华一笑间
2013-08-25 19:08:00 #5
。。。。。?(。。)
ID:92163
light_modestarstarstar
Lv.1 韶华一笑间
2013-08-25 19:25:00 #6
了了了了了了
ID:71765
light_modedark_modedark_modedark_modestar
Lv.9 有为九子能
2013-08-25 21:51:00 #7
。。。?
ID:135730
dark_modedark_modedark_modestarstarstar
Lv.2 独赏二月雪
2013-08-25 23:20:00 #8
看 看
ID:133190
light_modelight_modestar
Lv.1 韶华一笑间
2013-08-25 23:35:00 #9
我去
ID:139988
light_mode
Lv.1 韶华一笑间
2013-08-25 23:47:00 #10
蓝5哦
ID:86898
light_modedark_modestarstarstar
Lv.1 韶华一笑间
2013-08-26 00:24:00 #11
??????
ID:8990
dark_modedark_modedark_modestarstar
Lv.1 韶华一笑间
2013-08-26 10:57:00 #12
。。。
ID:138302
light_modestarstarstar
Lv.2 独赏二月雪
2013-08-27 19:57:00 #13
了绝配得给
ID:122352
dark_modedark_modedark_modestar
Lv.1 韶华一笑间
2013-09-11 22:41:00 #14
哦哦哦度
ID:133148
dark_modedark_mode
Lv.1 韶华一笑间
2014-05-08 11:25:00 #15
的人
ID:77180
light_modestarstarstar
Lv.1 韶华一笑间
2014-05-12 14:32:00 #16
ggv
ID:11271
light_mode
Lv.1 韶华一笑间
2014-07-26 11:19:00 #17
这么多
登录 后才能回复