变量生存期和变量作用域的区别

u013163178 2014-01-04 03:36:37
#include "stdafx.h"
#include<iostream>

using std::cout;
using std::endl;

int main()
{
int count1=10;
int count3=50;
cout<<endl
<<"value of outer count1="<<count1
<<endl;
{
int count1=20;
int count2=30;
cout<<"value of inner count1="<<count1
<<endl;
count1 += 3;
count3 += count2;
}
cout<<"value of outer count1="<<count1
<<endl
<<"value of outer count3="<<count3
<<endl;
return 0;
}

这段代码明明给count1进行了自加运算,为什么输出的值还是10,而count3的值却改变了呢。
int count1=10;
这段代码定义了变量count1,而后面又接着
int count1=20;

这不就重复定义了吗。我是新手,希望能给个详细的答案。
这是运行结果
...全文
514 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-01-05
  • 打赏
  • 举报
回复
函数的中的{} 内部的一系列语句 称为语句组,本来就是一个作用域。 所以函数内部,有两个种类型的作用域。 第一种,是函数作用域 包括函数参数和函数大括号内部的代码。 C++的构造函数的初始化表,应该也包括在内。 这个,是函数的,整个作用域。 第二种,就是语句组的作用域。 从左大括号{,到右大括号} 这是函数内部的,局部作用域 这个局部作用域,定义的变量,作用域是语句组。 其中: 定义的静态变量,作用域是语句组,生存周期是整个程序运行期间。 定义的自动变量,寄存器变量,作用域是语句组,生存周期是语句组。 语句组内部的变量,同样会遮蔽,函数内部和外部的同名变量。 这种情况,不构成名字冲突,但是构成遮蔽 这种遮蔽规律是: 1) 函数外部的作用域,定义的变量,会被函数内部定义的同名变量遮蔽。 2) 外层的语句组中,定义的变量,会被内层同名变量遮蔽。 3)似乎,构造函数的初始化表中的代码里,函数参数,不会遮蔽类的成员变量。 不过,A(int a) :a(a){} 代码,看起来还是有点怪怪的。
starytx 2014-01-04
  • 打赏
  • 举报
回复
引用 4 楼 u013163178 的回复:
[quote=引用 3 楼 starytx 的回复:] 同名的局部变量覆盖了全局变量。
似乎懂了,有方括号和没方括号是不一样的,方括号里面的局部变量,他会暂时替代同名的全局变量,等他的生存周期结束时,全局变量恢复,且值不改变,您是这个意思吗 [/quote]正确,也就是说编译器会以“就近”原则来处理同名问题,在局部变量的作用域中操作的只是局部的那个,除了这个作用域后的才是那个全局的
「已注销」 2014-01-04
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
同名的局部变量覆盖了全局变量。
似乎懂了,有方括号和没方括号是不一样的,方括号里面的局部变量,他会暂时替代同名的全局变量,等他的生存周期结束时,全局变量恢复,且值不改变,您是这个意思吗
starytx 2014-01-04
  • 打赏
  • 举报
回复
同名的局部变量覆盖了全局变量。
「已注销」 2014-01-04
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
1)C++,类(类型)和作用域,是和生命周期关系不大的。 类的成员变量,除了静态变量外,都是类的对象的一部分,生命周期和对象一样长。 类的静态成员变量,生命周期是程序生命周期。 类的对象的作用域,是定义它的哪个作用域。 生命周期由对象的定义形式决定。 2)C++ 名空间内部直接定义的变量,是属于名空间作用域的全局变量。 作用域是,名空间。 匿名名空间内的变量(相当于文件静态变量) 其他名空间内的变量 生命周期是程序生命周期。 3)外部变量,文件静态变量,都是整个程序生命周期。 4)函数内部的 静态变量,作用域为函数内部的某个区域,生命周期是 整个程序生命周期。 5)函数内部的自动变量,寄存器变量生命周期是函数调用开始到函数返回, 或者到抛出异常时之间的某一段时间。 作用域是函数内部某个区域 。。。。 6)函数参数,生命周期从函数调用开始,到函数调用结束。 构造函数之外的,作用域是函数内部。 构造函数,还包括构造函数的初始化表。 7)C++动态分配的对象的,生命周期,是从new,new[] 开始到 delete,delete[] 结束; C 动态分配的对象的,生命周期,是从malloc,开始到 free 结束; 动态分配对象,是一种全局的无名对象,通过指针,可以引用它。 作用域是全局的。生命周期从分配到回收。
能解释下我的代码中两个
int count1
为什么没有报错重复定义
lm_whales 2014-01-04
  • 打赏
  • 举报
回复
1)C++,类(类型)和作用域,是和生命周期关系不大的。 类的成员变量,除了静态变量外,都是类的对象的一部分,生命周期和对象一样长。 类的静态成员变量,生命周期是程序生命周期。 类的对象的作用域,是定义它的哪个作用域。 生命周期由对象的定义形式决定。 2)C++ 名空间内部直接定义的变量,是属于名空间作用域的全局变量。 作用域是,名空间。 匿名名空间内的变量(相当于文件静态变量) 其他名空间内的变量 生命周期是程序生命周期。 3)外部变量,文件静态变量,都是整个程序生命周期。 4)函数内部的 静态变量,作用域为函数内部的某个区域,生命周期是 整个程序生命周期。 5)函数内部的自动变量,寄存器变量生命周期是函数调用开始到函数返回, 或者到抛出异常时之间的某一段时间。 作用域是函数内部某个区域 。。。。 6)函数参数,生命周期从函数调用开始,到函数调用结束。 构造函数之外的,作用域是函数内部。 构造函数,还包括构造函数的初始化表。 7)C++动态分配的对象的,生命周期,是从new,new[] 开始到 delete,delete[] 结束; C 动态分配的对象的,生命周期,是从malloc,开始到 free 结束; 动态分配对象,是一种全局的无名对象,通过指针,可以引用它。 作用域是全局的。生命周期从分配到回收。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧