BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #92228同步于 2016/6/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

参数变量和局部变量区别?

henceman
2016/6/15镜像同步9 回复
void test(int arg1,int *arg2) { printf("%d and %d",arg1,*arg2) } 有人这样写 void test(int arg1,int * arg2) { int tmp1 =arg1; int * tmp2 =arg2; printf("%d and %d",tmp1,*tmp2) } 什么情况下需要把参数变量的值赋给局部变量呢?这样做编译器会不会把局部变量优化掉,直接引用栈帧上面的压栈参数? 另外,问个白痴的问题,为什么需要局部变量呢,把局部变量全部搞成参数可以吗,这样难道就成了lisp那种函数式编程? C/C++和java是不是参数传递方式都是值传递? 看到有的地方讲C的三种参数传递方式是 传值,传指针,传引用,我的理解是后两种其实是一回事,目的都是改变实参,但和第一种从根本上也没区别,只不过传入的是实参的地址的值。 对应于java,讲的是值(基本类型)和引用传递,但本质上,引用传递也只是对象地址的值。 所以有的地方讲这两种语言有的只是值传递也是没错的。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2016/6/15
你说为什么要有局部变量呢? 另外,java没有“按引用传递”(pass by reference),只有“按值传递”(pass by value)
henceman机器人#2 · 2016/6/15
【 在 nuanyangyang 的大作中提到: 】 : 你说为什么要有局部变量呢? : 另外,java没有“按引用传递”(pass by reference),只有“按值传递”(pass by value) 暖神,局部变量是不是都能用某种方式替换,如果C语言参数数量不受限制(好像是大于6个就得弄个地址传进去),那么是不是局部变量就可以参数+表达式的形式代替?参数和局部变量的作用域 生存期不都是受限于函数体吗?
nuanyangyang机器人#3 · 2016/6/15
这倒不是关键。关键是没有局部变量的话,编程很不舒服啊。 【 在 henceman 的大作中提到: 】 : 暖神,局部变量是不是都能用某种方式替换,如果C语言参数数量不受限制(好像是大于6个就得弄个地址传进去),那么是不是局部变量就可以参数+表达式的形式代替?参数和局部变量的作用域 生存期不都是受限于函数体吗?
changzhu机器人#4 · 2016/6/15
个人觉得,你举的这个例子,局部变量并没有什么卵用 ``` void test(int arg1,int * arg2) { int tmp1 =arg1; if(tmp1==2) { tmp1=tmp1*2; } printf("%d and %d",tmp1,arg1) } ``` 类似这种,大概意思是说,你传进来,局部变量接住 之后局部产量你想怎么改就改好了,但是传进来多少后面可能还要用
nuanyangyang机器人#5 · 2016/6/15
其实现代编译器都可以消除这里面的大多数局部变量。比如llvm,局部变量和参数都叫value。 【 在 changzhu 的大作中提到: 】 : 个人觉得,你举的这个例子,局部变量并没有什么卵用 : [md] : ``` : ...................
FromMars机器人#6 · 2016/6/15
局部变量跟函数参数传递混起来讨论总感觉有点牵强 局部变量跟全局变量\static变量一起讨论还差不多,不用局部变量难道是用全局变量吗? 函数参数怎么传递,通过值、指针、或者引用,到底来说还是看你的函数是需要什么功能,需要怎么得到函数执行结果。
MrGaGa机器人#7 · 2016/6/15
不知道你在纠结什么,在你问a和b有什么区别的时候应该隐含着a和b有很大的联系和相似。。。你问的这两者我除了他们都是变量之外看不出来有什么太深的联系。。。你举的例子中的局部变量没什么用,相信也没谁会这么写,但是自有别的用处,比如4楼那样用。你觉得4楼那样好还是 printf("%d and %d",arg1==2 ?arg1*2:arg1,arg1);这样好?
xiaobing307机器人#8 · 2016/6/15
顶6l
syx828机器人#9 · 2016/6/29
顶6l +1