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
}
为什么不对呢?哪里不对呢?
展开
 我来答
热情的大神
2018-05-26 · TA获得超过157个赞
知道小有建树答主
回答量:176
采纳率:73%
帮助的人:81.2万
展开全部

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

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

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 
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
自我编程
2018-01-06 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部
你定义函数的时候 用的是参数传值 不是传地址
add函数中的num 是函数自己的形参 和主函数中的num同名不同地址。
你在add函数中无论怎么改变num 对主函数中的num没影响
如果要想传址
函数定义void add(int *num) 用指针
调用的时候add(&num);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
红柿子炒番茄
2018-01-28
知道答主
回答量:7
采纳率:0%
帮助的人:6530
展开全部

做为C语言的过来人给你真正的解答,希望能帮到你!

你是想问为什么调用了add();函数后为啥在main()函数里面num值还是3,而在add();函数里面num变成了4对吧?

我从三个方面给你解答:作用域有三种:1代码块作用域 2函数原型作用域 3文件作用域

  1. 首先解答关于你标题问的关于“局部变量作用域”:因为你的变量是在函数内部声明的,就像你在main()函数里面声明的一样,它的作用域为代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾该变量均是可见的。

  2. 函数的性质你也需要明白,编写一个C语言函数基本分为三部分1.函数原型声明 2.函数调用 3.函数定义;你编写的add()函数就是这样。在函数原型声明中可以不写变量名因为对于编译器来说它只关心参数的类型和参数数目(函数原型的参量具有函数原型作用域,参量从声明开始到声明结束),而在函数定义中的变量如你写的void add(int num)中的num在函数定义中为也是属于局部变量,它也具有代码块作用域(尽管num在代码块的外部),而且这个add()函数中的num和你main()中的num不是同一个变量(你可以试着换其它名字结果还是一样)

  3. 在main函数中你调用了add(num);这个num为实参,而void add(int num)函数中的num为形参,这样做的目的是把main的num的值赋值给了add函数的形参num(而且这两个num不在同一个namespace里面所以你可以声明两个相同的num但是并不是同一个变量),你只是得到了数值的拷贝,也就是说你尽管改变了add()函数中的num但是并没有改变main()中的num,我想你应该还没学到指针,不用指针的方式也可以通过add()函数改变main()中的num; 你只需要这样写:

    int add(int); // 这里我把函数的返回类型声明为了int
    int main(void)
    {
    int num=3;
    num = add(num); //调用add()函数 ,并把返回值赋值给num
    printf("%d\n",num); //输出变量num值为4 
    }
    int add(int num)
    {
    num++; //num自增1 
    printf("%d\n",num); //输出变量num值为4 

    return num;
    }

    有不懂可以继续问,希望能帮到你

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风若远去何人留
推荐于2018-01-08 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450133
专业C/C++软件开发

向TA提问 私信TA
展开全部
这个和局部变量作用域没什么关系.
而是传参方式.
add函数传值调用, 而不是传指针调用.
所以在add中改变形参num的值,不会影响主函数中实参num的值.
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ly10604828
2018-01-12 · TA获得超过1465个赞
知道小有建树答主
回答量:341
采纳率:100%
帮助的人:358万
展开全部

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

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

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

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式