extern和static在C语言里面的作用这里就不做过多的阐述了,下面直接通过一个小程序来看一看他们修饰的变量的特性。
#include <stdio.h>
int count = 3;
int main()
{
int i = 0, count = 2, sum = 0;
for (i = 0; i < count; i += 2, count++)
{
static int count = 4;
count++;
if (i % 2 == 0)
{
extern int count;
count++;
sum += count;
}
sum += count;
}
printf("%d %d\n", sum, count);
system("pause");
return 0;
}
看到结果有没有很惊讶,下面就来通过调试一步步分析出这个结果:
那么可以得出:此时count是main函数中for循环语句之前定义的局部变量
执行完40行的语句后,count变为4,说明此时的count为static修饰的count
这儿应该是vs2013的一个bug,因为extern修饰的变量必须是具有外部链接属性的,也就是上面定义的全局的count,那么此时count的值应该为3(黄色箭头在第45行,说明第44行执行结束,要开始执行第45行了),为什么我这么说呢
可以看到即使我执行了count++,count的值也没有变化
而执行完sum+=count,sum的值是变成了4,而不是5(此时是执行到了48行,也就是要开始执行第48行,所以不要误认为是把第二次sum+=count都已经执行了),此时的count值变成5也是正确的了,因为此时的count是static修饰的count(if语句里的extern修饰的count是一个局部变量,他的作用域是if语句),为什么这么确定,看一看接下来sum值得变化就知道了
因为变量具有局部优先性,所以这儿的count是static修饰的count,而不是全局的count或是for循环之上的count
接下来就很简单了,i=2,此时的count=3,那么循环还是可以进去,再执行一次
此时i=4,count=4,二者值相等,所以不再进入循环,顺序向下执行
所以sum最终为20,那么输出sum为20,printf输出语句输出的count为4,是因为变量具有局部优先性,所以这儿的count是for循环上面的局部变量count,值为4