C语言变量类型隐式转换小圈套
发布时间:2021-12-13 11:42:00 所属栏目:PHP教程 来源:互联网
导读: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 st
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)问题解决。 ![]() (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |