2026年10月29日 · 今日 0 帖 · 会员 6.1万 · 主题 17.4万
登录 · 注册 · 游客,欢迎随便逛逛
返回版块
JK-0001000
Lv9有为九子能等级图标
勋章勋章勋章勋章勋章
帖子
9.3万
回复
2,089
积分
60.3万
注册
2006-12-06
[怀旧国机]

C语言一个微妙的Bug

[复制链接]
查看 232 回复 16
楼主 发表于 | 只看该作者

1 #include

  2

  3 int array[] = {23, 24 ,12, 204};

  4 #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array))

  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))

  建议:

  尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄、国债等)而用它来表示数量。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界的情况(如-1被转化为非常大的正整数)。

  只有在使用位段和二进制掩码的时候,才可以使用无符号数。应该在表达式中使用强制类型转化,是操作数均为有符号数或者无符号数,避免编译器来选择结果的类型。

登录回复
JK-0123695
Lv8能识八方语等级图标等级图标等级图标等级图标
勋章勋章勋章勋章勋章勋章勋章勋章+3
帖子
437
回复
9,643
积分
7.8万
注册
2012-09-30
1 楼

凤飞飞刚刚给很尴尬发过刚才查查vvvvvvvv规划局vv结结巴巴凤飞飞vv那就好过分vv7的

JK-0108305
Lv3畅意三江水等级图标
帖子
3
回复
545
积分
1.4万
注册
2012-05-19
3 楼

?!?。。。

JK-0123307
Lv4莫问四书意等级图标等级图标
勋章勋章
帖子
0
回复
834
积分
2万
注册
2012-09-25
4 楼

。。。。。?(。。)

JK-0092163
Lv3畅意三江水等级图标等级图标
帖子
0
回复
613
积分
1.7万
注册
2012-01-18
5 楼

了了了了了了

JK-0071765
Lv9有为九子能等级图标等级图标等级图标等级图标等级图标等级图标
勋章勋章勋章勋章勋章勋章勋章勋章+11
帖子
6
回复
1.1万
积分
630.7万
注册
2011-09-05
6 楼

。。。?

JK-0135730
Lv2独赏二月雪等级图标
勋章
帖子
0
回复
112
积分
4.3万
注册
2013-04-25
7 楼

看 看

JK-0139988
Lv2独赏二月雪等级图标
帖子
4
回复
244
积分
6,904
注册
2013-07-20
9 楼

蓝5哦

JK-0086898
Lv6胸怀六国志等级图标等级图标等级图标等级图标
勋章勋章勋章勋章
帖子
99
回复
2,725
积分
1.4万
注册
2011-12-10
10 楼

??????

JK-0008990
Lv1韶华一笑间等级图标
帖子
2
回复
27
积分
87
注册
2011-02-06
11 楼

。。。

JK-0138302
Lv4莫问四书意等级图标等级图标
帖子
19
回复
684
积分
2.5万
注册
2013-06-20
12 楼

了绝配得给

JK-0122352
Lv1韶华一笑间等级图标
帖子
0
回复
116
积分
1,675
注册
2012-09-13
13 楼

哦哦哦度

JK-0133148
Lv1韶华一笑间等级图标
帖子
0
回复
21
积分
313
注册
2013-03-07
14 楼

的人

JK-0077180
Lv5甘首五朝臣等级图标等级图标
勋章
帖子
8
回复
458
积分
1.2万
注册
2011-10-10
15 楼

ggv

登录后可以回复这个帖子。旧账号可使用原密码登录。

登录 注册新号
← 返回版块