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

voidadd(int);main(){intnum=3;add(num);//调用add()函数printf("%d\n",num);//输出变量num值为3}void... 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
}
为什么不对呢?哪里不对呢?
展开
 我来答
Yuqi_Tan

2018-02-05 · TA获得超过8.9万个赞
知道大有可为答主
回答量:9918
采纳率:93%
帮助的人:3471万
展开全部

这个题目先打印4,再打印3,运行正常呀,哪里不对了??

不是变量作用域问题,而是函数调用的形参与实参问题:

先看add函数,它需要一个整型变量做参数,参数的名字是num,这个num叫形参。注意函数的形参只在函数内部有效。

再来看主函数,它在调用add函数时,使用的参数也是num,这个叫实参。它正好与形参的名字相同。实际情况是,不管形参与实参名字相同与否,调用时,系统都会建立一个新的贮存单元,并把实参的值放进去,类似形成实参的一个副本,那么这个贮存单元就是形参的贮存器,以后add函数形参所做的一切变化如赋值,均是对副本的操作,而不会影响实参那个贮存单元里存放的值。

本题恰好使用的相同名字的形参和实参,对人是一种迷惑。假定把形参变成除num之外其它名字的变量,主函数调用正常进行,你就会发现形参与实参的区别了。如:

void add(int);
main()
{
int num=3;
add(num); //用实参num调用add()函数 
printf("%d\n",num); //输出变量num值为3 
}
void add(int n)//n是形参,它单独贮存
{
n++; //n自增1。注意,在这个函数里,不能使用num这个变量,若写num++是不会运行的
printf("%d\n",n); //输出变量n值为4。注意这个值在函数运行结束时自动消失,更不会回传给num!!!! 
}

你可以自己试一试。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2018-01-26
展开全部
//你如果想让其自增应该传递一个指针或者返回处理后的值
//子函数中num 虽然和main里面num名字一样,但其实是在运行时创建的,作用域只在子函数中
//你也可以创建全局变量来实现子函数的处理
// 620812






# include "stdio.h"

void add(int);
void addPoint(int *num);
int addReturn(int num);

int main()
{
    int Num=3;
    add(Num);             //调用add()函数
    printf("%d\n",Num); //输出变量num值为3    
    
    addPoint(&Num);             //调用add()函数
    printf("addPoint(&Num) %d\n",Num);         //输出变量num值为4    
    
    Num = addReturn(Num);         //调用add()函数
    printf("addReturn(Num) %d\n",Num);         //输出变量num值为5
    
    return 0;
}
void add(int num)
{
    num++; //num自增1
    //printf("%d\n",num); //输出变量num值为
}

void addPoint(int *num)
{
    (*num)++; //num自增1
    printf("addPoint :%d\n",*num); //输出变量num值为
}

int addReturn(int num)
{
    num++; //num自增1
    printf("addReturn :%d\n",num); //输出变量num值为
    return num;
    
}
// 为什么不对呢?哪里不对呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yes616035186
2018-01-22
知道答主
回答量:21
采纳率:0%
帮助的人:11.5万
展开全部

这个程序其实问题很多,不只是局部变量作用域的问题。引起你自己误解的最主要一个原因是你把函数参数的变量名写成跟main函数里的变量一样。

试着把add函数的参数变量改个名字变成:

void add(int numa)
{
numa++; //numa自增1 
printf("%d\n",numa); //输出变量numa值为4 
}

再带入你自己写的主程序,就会发现其实main函数里的printf是在打印num,不是numa..........这是问题一,但是你不能因此把main函数里打印的变量改成numa哦,因为numa是add函数的局部变量啊~(这也就是你提出作用域的问题,numa只作用于add函数内部)

第二个问题,当你调用函数,又想要获得这个函数结果的时候,是需要函数返回一个你需要的值的,比如加一句return numa; 相应的,函数的类型要定义成对应的数据类型,而不是void:

int add(int);
main()
{
int num=3;
num=add(num); //调用add()函数 
printf("%d\n",num); //输出变量num值为3 
}
int add(int num)
{
num++; //num自增1 
printf("%d\n",num); //输出变量num值为4 
return num;
}

你可能会发现我并没有用numa,其实名字一样是可以的,因为变量有各自的作用域,初学阶段建议还是使用不一样的变量名。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ZS坐看云起时
2018-01-25 · TA获得超过647个赞
知道小有建树答主
回答量:560
采纳率:92%
帮助的人:99.4万
展开全部
这是函数形参问题
函数add(int num),将形参 num加1
我们可以这样理解:
1、add(int num)函数执行时,将num=3抄下来,另存到函数内部,名为int num的变量中
这个变量是add函数内部的变量,不是外面的变量,只是将外部变量的值传给它
2、在add(int num)函数内部,不论对内部的变量做什么操作,都不影响外面的变量,本质上这就不是1个变量
3、例如,这个函数还可以这么调用呢,add(3);这样,也是将常数3传给内部变量int num
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cucumber1991ok
2018-01-13 · 超过15用户采纳过TA的回答
知道答主
回答量:40
采纳率:66%
帮助的人:12.4万
展开全部
首先,这不是“局部变量作用域”的问题。
C语言中,函数的数值传递常用的有两种方法:变量传递、指针传递。
显然,你使用的是变量传递。
add(num); 这个函数的作用是传入一个数值,然后这个数值加一。注意,这里仅仅是对传入的数值3进行加一,不是对main()函数中的num变量加一。所以无论你在add(num)函数中对传入的数值做任何操作,都不会改变main()函数中的变量num。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式