【发布时间】:2020-06-14 12:28:19
【问题描述】:
我是 C 新手,我正在阅读一本教科书,其中显示了一个函数的一些错误代码,用于确定一个字符串是否比另一个长:
int strlonger(char *s, char *t) {
return strlen(s) - strlen(t) > 0;
}
错误的原因是因为strlen的返回类型是无符号整数,所以当左操作数结果为负时,它会被强制转换为无符号类型,因此会产生不正确的结果,例如-1 将是最大的无符号值,当然大于 0。
看来strlen(s) - strlen(t)的结果也是无符号整数,但为什么一定要这样呢?我的意思是,例如,0u-1u 是 -1,-1 是有符号整数,那么 C 应该保持这个值 -1 而不会将其转换回无符号,因为我没有像这样编码:
...
unsigned int result = strlen(s) - strlen(t);
return result > 0;
还是C有一些特殊的规则,两个操作数的结果类型应该匹配操作数的类型?
【问题讨论】:
-
如果你使用
return strlen(s) > strlen(t);,你不会得到整数溢出/下流 -
0u - 1u是一个很大的正数,而不是-1 -
如果您调用 UB(可能使用
printf("%d\n", -1U);),任何事情都可能发生(在示例情况下,您的程序可能打印-1,尽管这远不能保证)
标签: c