回 帖 发 新 帖 刷新版面

主题:[讨论]迷惑不解??谁来帮我???!

在这下面的程序!!谁能解释啊?
  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个回复)

沙发

你想啊,在procedure中,其实m一直是()里面的那个(可以说新开了个内存,有两个m),在当前的procedure中,如果定义了局部变量,那么即使名字一样,和全局变量是没有关系的。

板凳

贺天行宝
你说什么我怎么不懂阿  我来说把
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 楼

如果没有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 楼

如果你在参数表中加了var,那么子程序对var后面的那个参数的操作是这样的:

主程序 -----------> 参数m <-----------子程序
        传递地址

子程序直接对主程序提供的地址进行修改,这是实实在在的修改了参数.

如果你没加var,那么子程序对参数的操作是这样的:

主程序 -----------> 复制的参数m <-----------子程序
        复制一份

主程序将变量复制一份交给子程序,子程序修改的只是复制的那一份, 回到主程序时, 原来的参数并未修改.

脸皮厚的人请求加30~~~

5 楼

1...m:integer; 值参:前无var后有类型 仅为过程和函数的执行提供初值而不影响调用时实际参数的值
2...var m:integer;变量参数 既有var又有类型
3...for example:
procedure sample(var x:integer,y:integer);
x的值可改变而y的值不能改变

我来回复

您尚未登录,请登录后再回复。点此登录或注册