C语言变量类型隐式转换小陷阱

Posted 善良超锅锅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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==-1p  ((i < len) && (j < strlen(T))) 的结果居然也是1gdb中打印的结果和真实运行情况不一样。

 

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

 


关于size_t

都说size_t是无符号整数,而且32位环境中为unsigned int64位环境中为unsigned long可是它在哪个文件中定义的呢?小弟在ubuntu13.04上用whereislocate找了好久翻遍了各种types.hstdio.h最终找到一个/usr/lib/syslinux/com32/include/bitsize/stddef.h里面定义了size_t。这个文件中的内容如下:

/*
* bits32/stddef.h
*/

#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 /* _BITSIZE_STDDEF_H */
 

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



C语言变量隐式转换规则

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


以上是关于C语言变量类型隐式转换小陷阱的主要内容,如果未能解决你的问题,请参考以下文章

记一个C系语言中数值类型变量隐式转换的小坑

记一个C系语言中数值类型变量隐式转换的小坑

梦开始的地方——C语言中那些细节

Python 的变量类型都可以隐式转换吗

c语言操作符小结

78.类型转换