歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言變量類型隱式轉換小陷阱

C語言變量類型隱式轉換小陷阱

日期:2017/3/1 9:52:41   编辑:Linux編程

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)問題解決。

接下來請看第2頁精彩內容:http://www.linuxidc.com/Linux/2013-10/90830p2.htm

Copyright © Linux教程網 All Rights Reserved