为何下述C语言代码输出结果为3而非5?
为什么这段代码输出3而不是5?
嘿,这个问题的核心坑点藏在无符号整数的运算规则里,咱们一步步拆解明白:
1. 先搞清楚strlen()的返回类型
strlen()函数的返回值类型是size_t,而size_t在C语言里是一个无符号整数类型(通常对应unsigned int或unsigned long)。也就是说,strlen(s)和strlen(t)的结果都是无符号数,不是咱们平时用的带符号int。
2. 无符号整数减法的特殊行为
当你用一个小的无符号数减去大的无符号数时,结果不会是负数——因为无符号整数没有负的概念,它会按照模2^n的规则循环计算(n是该类型的位数)。比如这里:
strlen(s)=3(无符号)strlen(t)=5(无符号)- 3-5的结果不是-2,而是一个非常大的正整数(比如32位
unsigned int下是4294967294)
3. 分析判断条件的逻辑
代码里的判断是:
((strlen(s) - strlen(t))> i ? strlen(s):strlen(t))
这里的i是unsigned int类型,所以比较的两边都是无符号整数。刚才算出来的3-5的结果是个极大的正整数,显然大于i=0,所以条件为真,最终取strlen(s)也就是3,这就是输出3的原因。
4. 怎么修改才能得到预期的5?
如果想让逻辑按照带符号数的方式判断,需要把strlen的结果强制转换成带符号的int:
int len = (( (int)strlen(s) - (int)strlen(t) )> 0 ? strlen(s):strlen(t));
这时候3-5=-2<0,条件为假,就会取strlen(t)=5了。
内容的提问来源于stack exchange,提问作者Tanmay Hole
相关产品推荐
相关产品推荐

