C语言“局部变量作用域”的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言“局部变量作用域”的问题相关的知识,希望对你有一定的参考价值。

void add(int);
main()

int num=3;
add(num); //调用add()函数
printf("%d\n",num); //输出变量num值为3

void add(int num)

num++; //num自增1
printf("%d\n",num); //输出变量num值为4

为什么不对呢?哪里不对呢?

应该是没有问题的。先输出add函数中的num值4,再输出main函数中的num值3。main函数中的num值没有发生变化。实参传递给形参,形参改变了不会影响实参。

具体分析过程如下图:

程序代码如下:

void add(int);
main()

int num=3;
add(num); //调用add()函数 
printf("%d\\n",num); //输出变量num值为3 

void add(int num)

num++; //num自增1 
printf("%d\\n",num); //输出变量num值为4 

在Visual C++ 6.0中编译会有个警告,不影响。

warning C4013: 'printf' undefined; assuming extern returning int

0 error(s), 1 warning(s)

如果要去除警告,只需程序开始加一条:#include<stdio.h>

在Visual C++ 6.0中运行结果如下图:

参考技术A

没有什么不对啊。完全正常的。

因为从main()调用add( )函数时的实参num=3在完成了传递值以后,main( )与add( )函数的变量之间就相互没有了关系。add( )函数中num++并输出4以后,对main( )函数中的变量没有丝毫的关系,所以返回后,输出main( )中的num的值仍是3。

参考技术B 这里涉及到变量作用域的问题,局部变量的作用域从声明开始,到所在函数的结束,,在子函数内的变量,同名的其他变量将被暂时屏蔽。所以会出现以上情况。在add函数内,add内的sum将暂时屏蔽main内的sum,但这两个sum并不是同意变量,你可以将他们在内存的地址打印出来证明一下。这时候add的sum接收传入的值3,自增后为4,将打印4,在add函数结束后,main内的sum恢复作用,但他们不是同意变量,所以main内的sum值并没有改变 参考技术C

代码注释部分是正确的。函数传参是值传递,并没有返回计算值,所以在main函数中num的值仍为3。这样写就很清楚了。传递的变量名与之前的值是不同含义的。

#include <stdio.h>

void add(int);

int main()

int num=3;
add(num); //调用add()函数 
printf("%d\\n",num); //输出变量num值为3 

void add(int x)    //值传递

x++; //参数x自增1 
printf("%d\\n",x); //输出变量x值为4 

参考技术D

这个是因为你写的函数调用参数值的时候只是把main函数里的num值复制了一份过来,对复制的值加1,而并没有对原值进行修改。想要修改原值,需要用指针把地址传过来。(你需要去看指针传参的知识)

C语言中的局部变量和全局变量


C语言中所有的变量都有自己的作用域。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

1 局部变量

局部变量也称为内部变量。局部变量是在函数内作定义说明的,其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。

对于局部变量作用域的几点说明:
1)主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
4)在复合语句中也可定义变量,其作用域只在复合语句范围内。

2 全局变量

**全局变量也称为外部变量,它是在函数外部定义的变量。**它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为 extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。

以上是关于C语言“局部变量作用域”的问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的局部变量和全局变量

C语言中的局部变量和全局变量

江哥带你玩转C语言 | 15- 修饰符和预处理指令

江哥带你玩转C语言 | 15- 修饰符和预处理指令

xxx

Javascript中的作用域问题