设为首页 加入收藏

TOP

C语言变量类型隐式转换小陷阱
2014-11-24 02:36:38 来源: 作者: 【 】 浏览:1
Tags:语言 变量 类型 转换 陷阱

int型变量可以直接和unsigned int 比较大小吗?不可以。


问题描叙


这个问题是我在写kmp算法时遇到的。


int Index_KMP(char *S, char *T, int pos)
{
int next[strlen(T)];
get_next(T,next);

int len = strlen(S);
int i = pos, j = 0;

while((i < len) && (j < strlen(T)))
{
if ( j == -1 || S[i] == T[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}

if ( j == strlen(T))
return i - j;
else
return -1;
}


老不能得到正确的结果,我用gdb断点跟踪了一下,发现while循环过早的退出了。


用gdb跟踪的结果:


(gdb) n
32 while((i < len) && (j < strlen(T)))
(gdb) n
34 if ( j == -1 || S == T[j])
(gdb) n
41 j = next[j];
(gdb) n
32 while((i < len) && (j < strlen(T)))
(gdb) p i
$1 = 4
(gdb) p j
$2 = -1
(gdb) p len
$3 = 24
(gdb) p strlen(T)
$4 = 3
(gdb) p ((i < len) && (j < strlen(T))) //这里((i < len) && (j < strlen(T)))为真,可是下一步居然跳出了循环
$5 = 1
(gdb) n
45 if ( j == strlen(T)) //为什么跳出了while循环呢
(gdb)


原因分析:


strlen函数的返回值类型为size_t。


当while条件语句中的j==-1时,j < strlen(T)返回值是为0的。因为-1转换为无符号整数是最大的无符号整数,所以j < strlen(T)一定为假。


但是我用gdb中打印 -1 < strlen(T)的结果居然为1。在j==-1时p ((i < len) && (j < strlen(T))) 的结果居然也是1。gdb中打印的结果和真实运行情况不一样。


把j < strlen(T)改为j < (int)strlen(T)问题解决。



相关阅读


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇大众点评笔试算法之质因数分解 下一篇C++建立动态二维数组

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: