C/C++变量作用域

97 篇文章 7 订阅

C/C++变量作用域

今天忽然想起作用域的问题,随手试验了下。

代码:

#include <stdio.h>
#include <stdlib.h>

// mark1
int n=1;
// scope 1 >>>

int main()
{
    printf("i:%d\n", n);
    // mark2
    int n=2;
    // scope 2 >>>
    printf("ii:%d\n", n);
    {
        // mark3
        int n=3;
        // scope 3 >>>
        printf("iii:%d\n", n);
        {
            // mark4
            int n = 4;
            // scope 4 >>>
            printf("iiii:%d\n", n);
            // scope 4 <<<
        }
        printf("iiiii:%d\n", n);
        // scope 3 <<<
    }
    printf("iiiiii:%d\n", n);
    return 0;
    // scope 2 <<<
}

// scope 1 <<<

输出:

g++ -o main  main.c 
[mytmp@localhost r]$ ./main
i:1
ii:2
iii:3
iiii:4
iiiii:3
iiiiii:2

说明:

mark1处定义的变量n是全局的,即可以在任何本文件(或者说模块,如果将一个.c文件认为是一个模块的话)中的函数中都是可达的,可见的,拥有操作(读或者写)的,其作用域是scope1。

mark2处定义的变量n是局部变量,其作用域是scope 2。

mark3处定义的变量n是局部变量,其作用域是scope 3。

mark4处定义的变量n是局部变量,其作用域是scope 4。

变量的作用域,高级别的,大的作用域,总是会被小的作用域覆盖,如果有重名变量的情况下。

mark1处的n作用域最大,但是其在main函数中的mark2处的“int n=2;”之后已经被覆盖作用域了,所以在scope2中,所有对n的操作都不再是全局mark1处的n这个变量了,而是较小作用域的mark2处定义的那个n。

但是,作用域会恢复。当脱离了小的作用域后,大的作用域依然存在。可见“iii”、“iiii”以及“iiiii”输出。在iiii时,存取的是小作用域,覆盖了大作用域iii处的n,但是当本作用域结束时,大作用域依然在,此时操作,就是大作用域的那个变量了。

可以用一对花括号来代表一个语句块,即一个作用域的范围。

在同一个作用域中两次定义同一个变量会导致重定义:“redefinition of xxx”。

while、for等{}中也是单独的作用域。

以后有别的思考再来补充吧~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值