|
2#
楼主 |
发表于 2012-9-23 02:29:29
|
只看该作者
本帖最后由 roych 于 2012-9-23 21:27 编辑
问题3:
取消公共变量之后,实际上嵌套函数已经发生很大变化的了。具体过程是:
第1次传址过程,没什么好说的,x=a+1=2,y=b+1=3,a=x+y=5
第2次传址过程,x=x+1=2+1=3,y=y+1=3+1=4,a=x+y=7。
从上面来看,实际上第2次传址过程并没有把a=5传递给fun1,而是继续进行循环内运算的(这和定义公共变量是完全不同的),换句话说,fun1(a,b)=a+y=7+4=11(这时候x=3,y=4)。
因此:fun1(fun1(a,b),b)=fun1(11,4),这样一来,那么显然循环就得执行4次了。
第1次:x=11+1=12,y=4+1=5,a=12+5=17
第2次:x=12+1=13,y=5+1=6,a=13+6=19
第3次:x=13+1=14,y=6+1=7,a=12+5=21
第4次:x=14+1=15,y=7+1=8,a=13+6=23
那么fun1(fun1(a,b),b)=fun1(11,4)=a+y=23+8=31。
因此得到的结果,显然是31,3,8【为什么是3,而不是15?以x才是15,a一直停留在嵌套内的循环里,即x=x+1+1=3。也就是说,嵌套前a已经定型了~~】
*************************************************************************************************
问题4:
事实上这和之前的解释没太大不同。过程如下:
第1次:x=a+1=2,y=b+1=3,a=x+y=5
第2次:x=x+1=2+1=3,y=y+1=3+1=4,a=x+y=7 fun1(a,b)=7+4=11。
而我们前面说过,传值过程,传递完之后,那个值是不会发生变化的。因此,外循环也只是循环2次。即:fun1(fun1(a,b),b)=fun1(11,2)
第1次:x=11+1=12,y=2+1=3,a=x+y=15
第2次:x=12+1=13,y=3+1=4,a=x+y=17
fun1(fun1(a,b),b)=fun1(11,2)=a+y=17+4=21。
b肯定是不变的2了,那么取消公共变量后的a呢?
不用猜了,取消公共变量后,传值完之后,变量便回复到初始值了,也就是a=1。会感到意外吗?
啰啰嗦嗦地讲这么多,也不知道会不会有人觉得,这些代码到底有没有实际用途呢?事实上,曾经为一个同事写过一段ADO的代码,他问了一个很专业的问题,为什么在Update记录集后,非要加上一句a=0呢?如果他了解传值过程和传址过程就很清楚原因了:加上这句后才能初始化数据啊。 |
|