给你解释下址传递和值传递
地址传递:就是把一个内存地址内的数据分别给多个变量使用.
就相当于一个人有两个名字(比如这人叫"A","B"),那么我叫A和叫B的结果都是一个样也就是我叫的都是同一个人,只是我的叫法不一样了,那么假如我说原来A有1个苹果,我给了B2个苹果,那么结果问A现在有几个苹果.因为A和B是同一个人,我给A和给B都是达到了同样的目的,那么答案肯定是3个当然结论就是"只要其中一个有了变化,那么另一个也随之变化.
数值传递:
数值传递则没有这样共用一个内存地址.他只是把形参的数据复制给实参,他们分别用了两个地址存放数据.同样用A和B来举例.A有1个苹果,现在我让B等于A(注意我是复制,而不是说现在B也是A),然后我在给B 2个苹果,那么现在A还是有1个苹果,而B有3个.因为我给的是不同的两个人所以后面的人和前面的互不影响.
再来看你的这题
先说明因为你这个程序里的XYZ没有定义为过程级以上的变量,所以两个过程中的XYZ若不经过传递是不会当作一个的,他们互相不干涉.为方便理解行参一律用了X1,Y1,Z1 实参一律用 X2,Y2,Z2.
根据辨别流程图知道X Y为按地址传递,Z为按值传递.
Call sub1(x, y, y) 调用了SUB1过程X1=X2=1,Y1=Y2=2,Z2=Y1=2 前面X1为形参,X2为实参,前面Y1为形参,Y2为实参.
因为过程中的X2Y2是地址传递,也就是说他和形参中的XY相当于同一个人2个名字.过程中的Z2是数值传递,只是把行惨Y1的数据复制给实参Z2. 也就是说X1Y1改变他会导致形参X1Y1变化,而实参Z2的改变不会引起形参Y1变化.
那么过程中:x = 3 * z: y = 2 * z: z = x + y
就是 X=3*2,Y=2*2,Z=X+Y Print 为 X=6,Y=4,Z=10
(注意此时因为实参XY为6和4,所以退出过程后X和Y仍然是X=6,Y=4)
退出过程后的 Print x,y,z
因为Z在程序运行过程中始终没有用到过,SUB1过程里的Z的变化不会对原来的Z=3产生改变,也就是仍然为Z=3
故结果Print x,y,z为: 6 4 3
请参考