Content #
C语言同时包含有符号数与无符号数,当执行一个运算时,如果参与运算的数,一个是有符号的,另一个是无符号的,那么C语言会隐式地将有符号的数转换成无符号的数,然后执行运算。
下面的代码要求数组所有元素的和:
/* WARNING: This is buggy code */
float sum_elements(float a[], unsigned length) {
int i;
float result = 0;
for (i = 0; i <= length–1; i++)
result += a[i];
return result;
}
当参数length为0时,由于length声明为无符号数,0-1会得到UMax,<=总会是真,代码会试图越界访问数组的元素。解决办法一,将length声明为int。解决办法二,使用<号代替<=。
下面的代码要用库函数strlen比较两个字符的长度:
/* Prototype for library function strlen */
size_t strlen(const char *s);
/* Determine whether string s is longer than string t */
/* WARNING: This function is buggy */
int strlonger(char *s, char *t) {
return strlen(s) - strlen(t) > 0;
}
当s比t短时,strlen(s)-strlen(t)的结果会是负的,但会变成一个很大的无符号数,始终会大于0。解决办法:
return strlen(s) > strlen(t);