主题:[讨论]迷惑不解??谁来帮我???!
tl3shi
[专家分:110] 发布于 2006-08-25 19:08:00
在这下面的程序!!谁能解释啊?
var
m:integer;
procedure t(var m:integer);
begin
m:=100;
writeln(m);
end;
BEGIN
m:=5;
writeln(m);
t(m);
writeln(m);
END.
结果是 5
100
100
但是如果是这样呢?
var
m:integer;
procedure t( m:integer);
begin
m:=100;
writeln(m);
end;
BEGIN
m:=5;
writeln(m);
t(m);
writeln(m);
END.
结果又是5
100
5
怎么回事啊?!!!??
回复列表 (共5个回复)
沙发
贺天行宝 [专家分:2300] 发布于 2006-08-25 19:36:00
你想啊,在procedure中,其实m一直是()里面的那个(可以说新开了个内存,有两个m),在当前的procedure中,如果定义了局部变量,那么即使名字一样,和全局变量是没有关系的。
板凳
lmj9201 [专家分:1400] 发布于 2006-08-28 15:26:00
贺天行宝
你说什么我怎么不懂阿 我来说把
procedure t(var m:integer);
这句加上var的意思是m的值会返回程序,比如说
var
m:integer;
procedure t(var k:integer);{把m改k}
begin
k:=100;
writeln(k);
end;
BEGIN
m:=5;
writeln(m);
t(m);
writeln(m);
END.
这样出来的答案也是
5
100
100
3 楼
lmj9201 [专家分:1400] 发布于 2006-08-29 14:24:00
如果没有var就不一样了,没有var意思是另外定义一个m,也就是局部变量,只在子程序里有效,如:
var
m:integer;
procedure t(k:integer);{把m改k}
begin
k:=100;
writeln(k);
end;
BEGIN
m:=5;k:=4;
writeln(m);
t(m);
writeln(m);
[color=FF0000]writeln(k);[/color]
END.
这样的结果是
5
100
5
4
4 楼
maxumi [专家分:2200] 发布于 2006-09-07 07:57:00
如果你在参数表中加了var,那么子程序对var后面的那个参数的操作是这样的:
主程序 -----------> 参数m <-----------子程序
传递地址
子程序直接对主程序提供的地址进行修改,这是实实在在的修改了参数.
如果你没加var,那么子程序对参数的操作是这样的:
主程序 -----------> 复制的参数m <-----------子程序
复制一份
主程序将变量复制一份交给子程序,子程序修改的只是复制的那一份, 回到主程序时, 原来的参数并未修改.
脸皮厚的人请求加30~~~
5 楼
waglongjuanfeng [专家分:90] 发布于 2006-10-05 03:08:00
1...m:integer; 值参:前无var后有类型 仅为过程和函数的执行提供初值而不影响调用时实际参数的值
2...var m:integer;变量参数 既有var又有类型
3...for example:
procedure sample(var x:integer,y:integer);
x的值可改变而y的值不能改变
我来回复