C语言extern与static修饰变量

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值