加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

C语言变量类型隐式转换小圈套

发布时间:2021-11-20 19:16:00 所属栏目:教程 来源:互联网
导读: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 s

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)问题解决。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读