局部变量和全局变量同名

时间:2022-11-05 10:27:40
首先,变量包括两个方面,类型和名称。比如
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?

23 个解决方案

#1


6啊。
名称查找规则,先从最近的作用域中搜寻,

#2


应该是6,
{
double b ; // 局部变量
b =9; //全局变量被覆盖,开始引用局部变量
}
离开综括号后,局部变量9就会被内存释放了

#3


应该是6,因为{ double b; b=9}局部变量的作用域只限于该语句块中,即大括号内。所以,lastvalue被赋的值为6。

#4


6.0
已经过了{}
局部的那个double b 已经失效了。

#5


6
你的注释已经很...

#6


6
就近原则

#7


注释不是很清楚了

#8


是取最近的作用域那个。
但我喜欢以命名规则避免重名,代码一眼看下去就要知道变量的作用域。

#9


谢谢 lz 分享,接分

#10


我现在遇到了一个问题,我定义了一个全局变量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]怎么会收进他们的值呢??

#11


建议LZ看编译原理中的拉链回填

#12


6吧。你可以在机子上试一下啊。试一下不就清楚了m

#13


引用 11 楼 goldbeef 的回复:
建议LZ看编译原理中的拉链回填
可否给个链接?

#14


在编程中使用全局变量本来就是一种不规范的办法.
想用作用域来规避冲突不能从根本上解决问题.
LZ碰到钉子才有认识?

#15


应该是6吧!楼上都说清楚了。

#16


第一个的double b也是等于局部变量d的值5吧?
第二个是6。。。注释也很清楚了

#17


引用 14 楼 cao_julians 的回复:
在编程中使用全局变量本来就是一种不规范的办法.
想用作用域来规避冲突不能从根本上解决问题.
LZ碰到钉子才有认识?
你是不是少打了几个字,在编程中怎么能不用全局变量呢,有些变量是所有函数都要用到的呀。
你是不是想说 全局变量和局部变量同名是不规范的  少打了几个字? 企盼你分享你的知识

#18


首先,变量包括两个方面,类型和名称。比如
double d = 0;  
void f() {
int d = 5;  
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,名称解析是不考虑类型的。

#19


结果是 6

#20


引用 18 楼 supermegaboy 的回复:
首先,变量包括两个方面,类型和名称。比如
double d = 0;  
void f() {
int d = 5;  
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,……
+++++++++++++++++++++++++++++++++

#21


引用 18 楼 supermegaboy 的回复:
首先,变量包括两个方面,类型和名称。比如
double d = 0;  
void f() {
int d = 5;  
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,……
哦,又有一个新声音! 不错,值得探讨!!到底能不能区分?

#22


引用 21 楼 liangchaoxi 的回复:
引用 18 楼 supermegaboy 的回复:
首先,变量包括两个方面,类型和名称。比如
double d = 0;
void f() {
int d = 5;
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
----------------------------------------……

没道理,C中没有按类型选择匹配的说法.C++只在函数重载过程中有选择匹配的说法,在赋值中只有作用域匹配

#23


应该是6,因为局部变量离开那个花括号之后就没有用了,据部变量的值无法更改全局变量的值,所有listvalue=6

#1


6啊。
名称查找规则,先从最近的作用域中搜寻,

#2


应该是6,
{
double b ; // 局部变量
b =9; //全局变量被覆盖,开始引用局部变量
}
离开综括号后,局部变量9就会被内存释放了

#3


应该是6,因为{ double b; b=9}局部变量的作用域只限于该语句块中,即大括号内。所以,lastvalue被赋的值为6。

#4


6.0
已经过了{}
局部的那个double b 已经失效了。

#5


6
你的注释已经很...

#6


6
就近原则

#7


注释不是很清楚了

#8


是取最近的作用域那个。
但我喜欢以命名规则避免重名,代码一眼看下去就要知道变量的作用域。

#9


谢谢 lz 分享,接分

#10


我现在遇到了一个问题,我定义了一个全局变量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]怎么会收进他们的值呢??

#11


建议LZ看编译原理中的拉链回填

#12


6吧。你可以在机子上试一下啊。试一下不就清楚了m

#13


引用 11 楼 goldbeef 的回复:
建议LZ看编译原理中的拉链回填
可否给个链接?

#14


在编程中使用全局变量本来就是一种不规范的办法.
想用作用域来规避冲突不能从根本上解决问题.
LZ碰到钉子才有认识?

#15


应该是6吧!楼上都说清楚了。

#16


第一个的double b也是等于局部变量d的值5吧?
第二个是6。。。注释也很清楚了

#17


引用 14 楼 cao_julians 的回复:
在编程中使用全局变量本来就是一种不规范的办法.
想用作用域来规避冲突不能从根本上解决问题.
LZ碰到钉子才有认识?
你是不是少打了几个字,在编程中怎么能不用全局变量呢,有些变量是所有函数都要用到的呀。
你是不是想说 全局变量和局部变量同名是不规范的  少打了几个字? 企盼你分享你的知识

#18


首先,变量包括两个方面,类型和名称。比如
double d = 0;  
void f() {
int d = 5;  
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,名称解析是不考虑类型的。

#19


结果是 6

#20


引用 18 楼 supermegaboy 的回复:
首先,变量包括两个方面,类型和名称。比如
double d = 0;  
void f() {
int d = 5;  
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,……
+++++++++++++++++++++++++++++++++

#21


引用 18 楼 supermegaboy 的回复:
首先,变量包括两个方面,类型和名称。比如
double d = 0;  
void f() {
int d = 5;  
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
--------------------------------------------------------
完全错误,……
哦,又有一个新声音! 不错,值得探讨!!到底能不能区分?

#22


引用 21 楼 liangchaoxi 的回复:
引用 18 楼 supermegaboy 的回复:
首先,变量包括两个方面,类型和名称。比如
double d = 0;
void f() {
int d = 5;
double b = d; //全局变量,因此全局变量的类型更匹配
}
这种情况两个d是可以区别的,因此b最后是使用全局变量d进行赋值。
----------------------------------------……

没道理,C中没有按类型选择匹配的说法.C++只在函数重载过程中有选择匹配的说法,在赋值中只有作用域匹配

#23


应该是6,因为局部变量离开那个花括号之后就没有用了,据部变量的值无法更改全局变量的值,所有listvalue=6