测试代码如下,为什么两个返回值一个是6,一个是12?unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    edt1: TEdit;
    btn1: TButton;
    edt2: TEdit;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure Myproc1(var x:Integer);
begin
  x:=x*2;
end;procedure Myproc2(x:Integer);
begin
  x:=x*2;
end;procedure TForm1.btn1Click(Sender: TObject);
var
  i:Integer;
begin
  i:=6;
  Myproc1(i);
  edt1.Text:=IntToStr(i);       //显示为 12  i:=6;
  Myproc2(i);
  edt2.Text:=IntToStr(i);       //显示为 6
end;end.

解决方案 »

  1.   

    var 是引用 &
    比方 你的姓名是你,var用的是你的小名, 和你完全一样
      

  2.   

    当然不一样,第一个Var I 是变参,值已经改变了,是12,第2个显示的是I:=6的值,Myproc2并未对i值进行修改
      

  3.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:Integer;
    begin
      i:=6;
      Myproc1(i); //这里对变量i的值进行了修改,变参i传入后,经过计算了
      Edit1.Text:=IntToStr(i);      //显示为 12
      i:=6;
      Myproc2(i); //这里并未对i进行修改,所以i:=6
      Edit2.Text:=IntToStr(i);      //显示为 6
    end;
      

  4.   

    参数前加var/out是按地址传输(const在一些情况下也如此),在过程中可以修改原数据的值;否则的话,传入的数据是原来数据的一个复本,除了本身就是个简单指针的类型(如对象)外,对数据的修改都是局部的
      

  5.   

    简单点 var修饰的参数,是可以更改值的,传进的实参,是可以在程序中进行修改的