为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
慕娘9325324 2019-03-16 11:11:13
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 }为什么不对呢?哪里不对呢?
查看完整描述

8 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-03-25
?
长风秋雁

TA贡献1757条经验 获得超7个赞

这个和局部变量作用域没什么关系.
而是传参方式.
add函数传值调用, 而不是传指针调用.
所以在add中改变形参num的值,不会影响主函数中实参num的值.

查看完整回答
反对 回复 2019-03-25
?
慕后森

TA贡献1802条经验 获得超5个赞

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

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



查看完整回答
反对 回复 2019-03-25
?
郎朗坤

TA贡献1921条经验 获得超9个赞

add函数里面的num是另一个变量,和主函数中的num不一样。它们两都是临时变量,除了变量名相同没有什么关系。

add函数只是通过参数的方式获取了主函数里面的num的值,也就是给了add中的num初始值,但是并没有把计算后的值返回给主函数中的num,所以主函数中的num并没有被改变

1

2

3

4

5

6

7

8

9

10

11

12

13

main()

{

   int num=3;

   add(num); //调用add()函数 

   printf("%d\n",num); //输出变量num值为3 

}

 

//把变量名换一下就明白了,这个变量和num是两回事,和局部变量作用域没有半毛钱关系

void add(int aa)

{

    aa++; //aa自增1 

    printf("%d\n",aa); //输出变量aa值为4 

}

 


查看完整回答
反对 回复 2019-03-25
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

因为你的add函数是传值进来的,不是传址。你对形参自增,也只是将新的变量num自增了而已,原先的变量num,还是不会变的。
除非,你 void add(int *num) { *num = *num + 1;printf("%d\n",*num);}
外面就 add(&num);

查看完整回答
反对 回复 2019-03-25
?
九州编程

TA贡献1785条经验 获得超4个赞


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

//注释的描述应该都对没有错。

//如果说时编译不过,时因为缺少头文件和main函数返回类型

#include <stdio.h>

void add(int);

void 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 

}

 


查看完整回答
反对 回复 2019-03-25
?
慕工程0101907

TA贡献1887条经验 获得超5个赞


你的注释里面的输出是对的。

这个问题并不是探讨局部变量作用域的问题,而是函数是传值还是传址的问题。传值,指的是参数传递的过程中,传过去的参数实际传入的是这个变量的一个拷贝而不是这个变量本身。因为对变量拷贝所以对拷贝后的变量做任何更改都不会改变变量本身。如果需要改变变量本身,可以传递变量的地址过去,再修改地址里面的内容。这是指针的知识。以后你学到指针,你就会明白这个道理。下面附的代码是讨论作用域的问题。

1

2

3

4

5

6

7

8

9

10

int a =1;

main(){

    printf("a1 = %d\n",a);

    int a = 2;

{

    int a =3;

    printf("a3 = %d\n",a);

}

    printf("a2 = %d\n",a);

}


 


查看完整回答
反对 回复 2019-03-25
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

首先,这不是“局部变量作用域”的问题。
C语言中,函数的数值传递常用的有两种方法:变量传递、指针传递。
显然,你使用的是变量传递。
add(num); 这个函数的作用是传入一个数值,然后这个数值加一。注意,这里仅仅是对传入的数值3进行加一,不是对main()函数中的num变量加一。所以无论你在add(num)函数中对传入的数值做任何操作,都不会改变main()函数中的变量num。

查看完整回答
反对 回复 2019-03-25
  • 8 回答
  • 0 关注
  • 901 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信