会转的风车会变颜色c语言,[转载]C语言变量类型隐式转换小陷阱

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

关于size_t

都说size_t是无符号整数,而且32位环境中为unsigned int,64位环境中为unsigned

long可是它在哪个文件中定义的呢?小弟在Ubuntu13.04上用whereis和locate找了好久翻遍了各种types.h,stdio.h最终找到一个/usr/lib/syslinux/com32/include/bitsize/stddef.h里面定义了size_t。这个文件中的内容如下:

#ifndef _BITSIZE_STDDEF_H

#define _BITSIZE_STDDEF_H

#define _SIZE_T

typedef unsigned int size_t;

#define _PTRDIFF_T

typedef signed long ptrdiff_t;

#endif

哪位能找到其他地方的size_t的32位和64位明确的定义,麻烦把详细的平台和路径给我说一下,或者一个源代码的链接。

C语言变量隐式转换规则

如果把不同类型的数据放在一起运算,隐式转换规则为:窄的转为宽的,范围小的提升为范围大的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值