最近看了有个题目,写一个函数用来判断一个字符串是否比另一个大,前提是要用到字符串库函数strlen,它给出个答案
这个答案在某种情况下会出错,并且解释为什么会出错怎么修改。
提示说strlen返回的是unsigned类型,我当时第一反应是如何s字符串长度比t的小,那么两个无符号的数相减是一个有符号的负数呢,还是一个无符号的数,如果是有符号那就没有问题,无符号当然就会有问题了,为了解决疑惑,做了以下实验:
1. s = "abc", t = "abcd", strlonger返回值为1;
2. 在1的条件下,修改return语句,(unsigned)( strlen ( s ) - strlen ( t )) < 0, strlonger返回值为0;
3. 在1的 条件下,修改return语句, strlen ( s ) - strlen ( t ) < 0u, strlonger返回值为0;
由此可推断两个无符号相减是有符号的,那么本题到底有哪里有问题呢?那就是无符号值的表达范围Max_int比有符号大,再xian
- int strlonger(char *s, char* t)
- {
- return strlen(s) - strlen(t) < 0;
- }
提示说strlen返回的是unsigned类型,我当时第一反应是如何s字符串长度比t的小,那么两个无符号的数相减是一个有符号的负数呢,还是一个无符号的数,如果是有符号那就没有问题,无符号当然就会有问题了,为了解决疑惑,做了以下实验:
1. s = "abc", t = "abcd", strlonger返回值为1;
2. 在1的条件下,修改return语句,(unsigned)( strlen ( s ) - strlen ( t )) < 0, strlonger返回值为0;
3. 在1的 条件下,修改return语句, strlen ( s ) - strlen ( t ) < 0u, strlonger返回值为0;
由此可推断两个无符号相减是有符号的,那么本题到底有哪里有问题呢?那就是无符号值的表达范围Max_int比有符号大,再xian
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29444108/viewspace-1140422/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29444108/viewspace-1140422/