免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5014 | 回复: 8
打印 上一主题 下一主题

strlen返回值迷惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-23 10:35 |只看该作者 |倒序浏览
if( strlen(x) - strlen(y) >= 0)...
if( strlen(x) >= strlen(y))...
因为strlen返回值是size_t,也就是unsigned int,所以if( strlen(x) - strlen(y) >= 0)...一直是真,个人理解 strlen(x)和 strlen(y)一直为真没问题,但相减为真实为不解。
小弟不解所以提问,还请大家大大们多指教。

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
2 [报告]
发表于 2012-02-23 10:38 |只看该作者
size_t不是布尔型

论坛徽章:
0
3 [报告]
发表于 2012-02-23 10:43 |只看该作者
回复 2# ruifengzhangyi


    这和布尔值有关吗?能不能给点更详细的分析,先谢过了.

论坛徽章:
0
4 [报告]
发表于 2012-02-23 11:47 |只看该作者
回复 1# 伤不起


    不是“相减为真”而是“相减的结果大于等于零”为真。

论坛徽章:
0
5 [报告]
发表于 2012-02-23 12:40 |只看该作者
giantchen 发表于 2012-02-23 11:47
回复 1# 伤不起
真不好意思,描述出错。但是请看下面这段代码,结果是打印的b吧。strlen(a) - strlen(b) 溢出了,所以到天荒地老都是>=0的。
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         char a[] = "asdef";
  6.         char b[] = "lkjsdkjfhkl";
  7.         if(strlen(a) >=  strlen(b))
  8.                 printf("==========a===========\n");
  9.         if(strlen(a) - strlen(b) >= 0)
  10.                 printf("==========b=============\n");
  11.         return 0;
  12. }
复制代码

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
6 [报告]
发表于 2012-02-23 12:43 |只看该作者
strlen返回值为size_t

那么两个size_t值相减的值的类型也为size_t

size_t是恒大于等于0的


即使:
size_t a = strlen(sa);   // 10
size_t b = strlen(sa);   // 20

那么 a-b = -10, 然后再转为size_t,结果也是 2^32-10

论坛徽章:
0
7 [报告]
发表于 2012-02-23 12:50 |只看该作者
txdgtwpv 发表于 2012-02-23 12:43
strlen返回值为size_t

那么两个size_t值相减的值的类型也为size_t
感谢大大的分析,终于明白了。

论坛徽章:
0
8 [报告]
发表于 2012-02-23 12:56 |只看该作者
因为变量a,b都为unsigned int型,所以a,b的运算结果也为unsigned int型。
例如,a=0x02,b=0x05,则a-b=0xfffffffd=4294967293>0

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
9 [报告]
发表于 2012-02-23 14:24 |只看该作者
真诡异
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP