You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何下述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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:32:21