C++ 自学教程 LearnCPP 第1.4d章 初探本地作用域

C++ 自学教程 第1.4d章

你已经在第1.3章学习了:当CPU看到 int x; 这样的叙述语句后,它会创立变量x。
自然而然的,你可能会问:“所以什么时候变量会被销毁呢?”

“毁灭”的时机

一个变量的作用域决定了一个变量什么时候能被生成和使用。在函数内部定义的参数和变量都有局部作用域。也就是说,他们只能在定义了他们的函数内部被看见和使用。局部变量在其被定义的时候被生成,超过其作用域的时候被销毁(一般在函数最后)。

下面给个简单的例子:

#include <iostream>

int main()
{
    int x; //这里x被生成
    std::cout << "Enter a value for x: ";
    std::cin >> x;
    std::cout << "You entered: " << x << std::endl;

    return 0;
} //这里x被销毁

下面的例子更复杂一点:

#include <iostream>

int add(int x, int y) //这里生成了x和y
{
    //x和y只在这个函数内部有效
    return x + y;
} //这里超过了x和y的作用域,它们被销毁了

int main()
{
    int a = 5; //这里生成并初始化了a和b
    int b = 6; 
    //a和b只在这个函数内部有效
    std::cout << add(a, b) << std::endl; // calls function add() with x=a and y=b
    return 0;
} //这里超过了a和b的作用域,它们被销毁了

在函数add()里,参数x和y在函数被调用的时候被创立,它们只在函数add()内部有效,并在函数结束时被销毁。变量a和b在主函数内创立,它们只在主函数内部有效,并在函数结束时被销毁。

为了加深理解,我们来看看依次发生了什么:
• 主函数被执行
• 变量a被生成,并被赋值5
• 变量b被生成,并被赋值6
• 函数add()被调用,给定参量分别是5和6
• add的变量x被生成,被赋值为5
• add的变量y被生成,被赋值为6
• 运算符号+将5和6相加,得到11
• 函数add向呼叫函数返回11
• 函数add变量的x和y被销毁
• 主函数向控制台输出11
• 主函数向操作系统返回数值0
• 主函数的变量a和b被销毁

到这里就结束了。

注意,如果函数add()被调用了两次,那么x和y也会被创建和小孩两次。如果一个程序有很多函数并调用了很多次函数,那么就会有很多变量被创立和销毁。

在上面的例子里,区分变量a,b与变量x,y不是难事。
下面我们来看看下面这个程序:

#include <iostream>

int add(int x, int y) //函数add的变量x和y在这里被创立
{
    return x + y;
} //函数add的变量x和y在这里被销毁

int main()
{
    int x = 5; //主函数的变量x和y在这里被创立
    int y = 6; 
    std::cout << add(x, y) << std::endl; //主函数的变量x和y的值被赋值给了函数add的x和y
    return 0;
} //主函数的变量x和y在这里被销毁

在这个例子里,我们所做的只是改变了函数add内部变量的名字。这段程序依旧能够正常运行,虽然主函数和函数add的变量的名字相同。为什么呢?

首先,我们需要知道虽然主函数和函数add都有一个叫做x的变量,但是这两个变量是不同的。主函数和add函数里的变量x是完全不同的,虽然他们名字相同。

简单来讲,函数add和主函数都不知道对方有一个同名变量。编译器永远都很清楚哪个变量在主函数内是有效的,哪个变量在add函数内可以被使用。这一功能非常有用,因为它使我们的编程变得更加简单。

我们将会在第四章谈更多局部变量的事。

规则:在函数内部被定义的变量和参数只在其内部有效。


小测试

下面这段程序输出什么?

#include <iostream>

void doIt(int x)
{
    int y = 4;
    std::cout << "doIt: x = " << x << " y = " << y << std::endl;
    x = 3;
    std::cout << "doIt: x = " << x << " y = " << y << std::endl;
}

int main()
{
    int x = 1;
    int y = 2;
    std::cout << "main: x = " << x << " y = " << y << std::endl;
    doIt(x);
    std::cout << "main: x = " << x << " y = " << y << std::endl;
    return 0;
}





main: x = 1 y = 2
doit: x = 1 y = 4
doit: x = 3 y = 4
main: x = 1 y = 2


说明: 这系列笔记是基于网上一个英文教程LearnCPP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值