局部变量和全局变量同名

liangchaoxi 2011-10-28 10:45:18
首先,变量包括两个方面,类型和名称。比如
double d = 0;
void f() {
int d = 5;
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
其次,如果局部变量和全局变量的类型与名称完全一致,在局部变量定义的有效域中,局部变量将覆盖全局变量。直到退出局部变量定义域,全局变量的定义才又重新可见。比如:
double b ;
void f()
{
b = 6; //还是全局变量,因为局部变量仍然没有定义
{
double b ; // 局部变量
b =9; //全局变量被覆盖,开始引用局部变量
}
int lastvalue = b; // 局部变量的作用域已经退出,因此此处引用全局变量
}



问:最后lastvalue等于多少? 是9还是6?
...全文
1089 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiao61417 2011-10-31
  • 打赏
  • 举报
回复
应该是6,因为局部变量离开那个花括号之后就没有用了,据部变量的值无法更改全局变量的值,所有listvalue=6
cao_julians 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 liangchaoxi 的回复:]
引用 18 楼 supermegaboy 的回复:
首先,变量包括两个方面,类型和名称。比如
double d = 0;
void f() {
int d = 5;
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
----------------------------------------……
[/Quote]
没道理,C中没有按类型选择匹配的说法.C++只在函数重载过程中有选择匹配的说法,在赋值中只有作用域匹配
小木 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 supermegaboy 的回复:]
首先,变量包括两个方面,类型和名称。比如
double d = 0;
void f() {
int d = 5;
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,……
[/Quote]+++++++++++++++++++++++++++++++++
小木 2011-10-30
  • 打赏
  • 举报
回复
结果是 6
飞天御剑流 2011-10-30
  • 打赏
  • 举报
回复
首先,变量包括两个方面,类型和名称。比如
double d = 0;
void f() {
int d = 5;
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,名称解析是不考虑类型的。
liangchaoxi 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cao_julians 的回复:]
在编程中使用全局变量本来就是一种不规范的办法.
想用作用域来规避冲突不能从根本上解决问题.
LZ碰到钉子才有认识?
[/Quote]你是不是少打了几个字,在编程中怎么能不用全局变量呢,有些变量是所有函数都要用到的呀。
你是不是想说 全局变量和局部变量同名是不规范的 少打了几个字? 企盼你分享你的知识
liangchaoxi 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 supermegaboy 的回复:]
首先,变量包括两个方面,类型和名称。比如
double d = 0;
void f() {
int d = 5;
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,……
[/Quote]哦,又有一个新声音! 不错,值得探讨!!到底能不能区分?
liangchaoxi 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 goldbeef 的回复:]
建议LZ看编译原理中的拉链回填
[/Quote]可否给个链接?
ProgrammingRing 2011-10-29
  • 打赏
  • 举报
回复
第一个的double b也是等于局部变量d的值5吧?
第二个是6。。。注释也很清楚了
wizard_tiger 2011-10-29
  • 打赏
  • 举报
回复
应该是6吧!楼上都说清楚了。
cao_julians 2011-10-29
  • 打赏
  • 举报
回复
在编程中使用全局变量本来就是一种不规范的办法.
想用作用域来规避冲突不能从根本上解决问题.
LZ碰到钉子才有认识?
cento123 2011-10-28
  • 打赏
  • 举报
回复
是取最近的作用域那个。
但我喜欢以命名规则避免重名,代码一眼看下去就要知道变量的作用域。
  • 打赏
  • 举报
回复
注释不是很清楚了
编程点滴 2011-10-28
  • 打赏
  • 举报
回复
6
就近原则
lanqiucoco 2011-10-28
  • 打赏
  • 举报
回复
6
你的注释已经很...
风尘流月 2011-10-28
  • 打赏
  • 举报
回复
6吧。你可以在机子上试一下啊。试一下不就清楚了m
序员 2011-10-28
  • 打赏
  • 举报
回复
6.0
已经过了{}
局部的那个double b 已经失效了。
goldbeef 2011-10-28
  • 打赏
  • 举报
回复
建议LZ看编译原理中的拉链回填
liangchaoxi 2011-10-28
  • 打赏
  • 举报
回复
我现在遇到了一个问题,我定义了一个全局变量a,然后赋值:
a=(float)((P8IN*4+(P11IN & 0x03))*2*3.14159256)/1023;//角度传感器度数
在一些显示程序里面定义了局部同名变量a:
void swap_int(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
然后出来

然后后面又把全局a的值给了一个数组单元: value0[4]=a;//回转指针显示

在后面的程序里面还有一些函数里面也定义了同名局部变量a。

然后我有一个函数里面是把 value0[4](之前已经将value0[4]放到了Request_Set里面)发出去。这个函数里面定义了a为26,也就是发送命令的控制符的值

以上出现同名变量的地方已经说明出来了。

int a=26;//发送符命令“ctrl+z”ASCII码
UART0_SendStr("AT+CIPSEND\r\n");//发送命令
UART0_SendStr_char(Request_Set);
UART0_SendByte(26);//相当于手动发送时 按ctrl+Z操作

按理说,局部变量只在定义它的函数内起作用,因而不会影响我外面的a,但是我运行程序的过程中发现,发出的值,不仅有角度数值a,还有其他的值,考虑到可能是把其他的同名变量的值弄过来了,所以尝试把角度变量名改了,改成mya,然后再重新发送,发现没有其他值干扰的现象了,出来的正是只有角度值。

所以我很疑惑,按理说,局部变量只在定义它的函数内起作用,离开了该函数(作用域)就直接失效了,value0[4]怎么会收进他们的值呢??
自信男孩 2011-10-28
  • 打赏
  • 举报
回复
应该是6,因为{ double b; b=9}局部变量的作用域只限于该语句块中,即大括号内。所以,lastvalue被赋的值为6。
加载更多回复(3)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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