这是一个讨论题,学了类型转换之后很好理解,但是之前我想法错了,在此分享一下。
#include<stdio.h>
void sum(int a[],unsigned len)
{
int i,sum=0;
for(i=0;i<=len-1;i++)
{
sum+=a[i];
}
printf("%d",sum);
}
int main()
{
int a[3]={1,2,3};
sum(a,0);
}
运行后会有什么结果?
解答:
没有结果。
注意len是unsigned类型,传参0的时候,for循环里len-1会将int的-1转换为unsigned。
(表达式存在有符号数和无符号数时,int默认转换为unsigned)
转换过程:
-1的补码为1111 1111 1111 1111 1111 1111 1111 1111
在unsigned中这个数代表2^32-1。
其中a数组只有3个元素,for循环中会非法访问,引起段错误。