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
}
为什么不对呢?哪里不对呢?
展开
 我来答
hellojju
2018-01-16 · TA获得超过1662个赞
知道答主
回答量:44
采纳率:100%
帮助的人:26.2万
展开全部

应该是没有问题的。先输出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中运行结果如下图:

听不清啊
高粉答主

推荐于2018-02-08 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部

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

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

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
推荐于2018-01-06
展开全部
这里涉及到变量作用域的问题,局部变量的作用域从声明开始,到所在函数的结束,,在子函数内的变量,同名的其他变量将被暂时屏蔽。所以会出现以上情况。在add函数内,add内的sum将暂时屏蔽main内的sum,但这两个sum并不是同意变量,你可以将他们在内存的地址打印出来证明一下。这时候add的sum接收传入的值3,自增后为4,将打印4,在add函数结束后,main内的sum恢复作用,但他们不是同意变量,所以main内的sum值并没有改变
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
IT圈新鲜事
2018-01-16 · 记录IT技术领域中的新鲜事
IT圈新鲜事
采纳数:1722 获赞数:11351

向TA提问 私信TA
展开全部

代码注释部分是正确的。函数传参是值传递,并没有返回计算值,所以在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 
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mariner
2018-01-20
知道答主
回答量:10
采纳率:0%
帮助的人:7401
展开全部

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(120)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式