难道没人可以从深层次来分析一下吗

解决方案 »

  1.   

    这个你似乎已经问过了,没有必要在这个问题讨论多深啊,你会用,知道怎么用就行了
    其实很语言都有类似的,C++都是函数,但函数分有返回值和无返回值,就跟Delphi的函数和过程是一样的。这个应该没有什么吧,要讨论多深呢。你举个方面来说说
      

  2.   

    个人觉得,Delphi之所以把procedure和function分得这么清楚,大概是因为开始设计它的人对其注入了一种与C语言截然不同的理念.在日常理解上,函数意味着将输入的数进行一系列的运算得到结果,而过程则意味着执行一系列的动作.这个"动作",往往修改了外界的一些东西,使某些数据在调用该过程后发生了一些永久的变化.比如某个变量或文件被修改了,比如屏幕上多了一行字.也就是学C语言时老师一再提醒注意的,表达式的"副作用".相对而言,所谓"主作用",似乎指的就是函数的返回值(表达式的结果).在C中,始终将表达式的主作用和副作用混杂在一起,以至于让人对a=(i++)*(++i)之类的表达式伤透了脑筋.Pascal的设计者似乎有意的避免这一点,着意使表达式的主作用和副作用泾渭分明.这样也许表达式显得罗嗦了,但不得不承认,"a:=i;Inc(i);"与"Inc(i);a:=i;"的区别,要比"a=i++;"和"a=++i;"的区别让人更容易接受的多,尤其表达式越趋于复杂的时候.似乎,在Pascal得理念中,procedure是应该有副作用的,就要和主作用不沾边,而function是用于"主作用"的,则在其中不应该有任何的副作用,就像C++的const方法.不知处于什么原因,最终Pascal并没有在语法上禁止function中对于"副作用"的使用(也许是迫于目光短浅的"实用主义者"的压力^_^),然而,略加注意就能知道,Pascal的库函数都是有意无意的注意将"主作用"和"副作用"截然分开的.比如,inc和dec被设计成没有返回值,就连:=运算符都不像C语言的那样有个结果值.本人起初也曾浅薄地觉得Pascal这个地方实在不如C的方便,但后来似乎终于有一点体会到了当年大师们的苦心.有意的将表达式的"主作用"和"副作用"分开,对于程序的明晰性来说,实在不是一般的助益.在这个思想引导下,本人编写子程序的时候,都尽可能使function真正实现"零副作用",而从不可避免有副作用的子程序传出数据的时候,都使用procedure的var/out参数而不是function的返回值.供参考!呵呵
      

  3.   


    过程和函数都是具有单入口(single entry)和单出口(single exit)的子程序。按照Object Pascal语言设计师Niklaus Wirth的观点,过程为完成任务或任务集合的代码实体(entity),函数则为完成计算或计算集合的代码实体。当调用过程时,对象被更新,过程抽象的用户只能看到这些对象被更新,而无从知道发生变化的步骤;在调用函数时,用户
    只能看到结果值,却无从知道求值的具体步骤。从表面上看就是:函数有返回值;过程没有返回值。在实际编程中,很多地方用过程和函数都能实现程序所需的功能,只不过看哪个方便而已。
      

  4.   

    返回值不能作为两者的区别,过程也可以有返回值,定义过程参数时加上Var
      

  5.   

    这个问题,不用一直纠缠不清,意义不是太大,等你的delphi用到一定的熟练程度的时候,这些问题便迎刃而解了!!
      

  6.   

    区分他们意义不大,主要是从使用方便角度来确定
    function可以作为右值,procedure不可以如果一个routine没有返回值,你硬是编成function,那返回什么呢?
    C用返回void来表示不返回,其实和procedure完全是一样的
    并不是说只有pascal才有procedure或function,没有这回事,
    只是pascal使用关键字,使得代码看起来清晰一点,而且可以提高语法分析的速度
      

  7.   

    to alphax(多喝了三五杯):function可以作为右值,procedure不可以: function可以做左值,procedure不可以,
                                           function和procedure都可以做右值
    routine可以编成有返回值,boolean型,成功执行返回true,不成功返回false不就可以了只是pascal使用关键字,使得代码看起来清晰一点,而且可以提高语法分析的速度:非常展同啊,delphi超级快的编译速度,其实object pascal语言本身的有点所至,
      

  8.   

    //区别只在于你是怎么理解的~~type
      TShowMessage = function(Msg: string): Pointer;procedure TForm1.Button1Click(Sender: TObject);
    begin
      TShowMessage(@ShowMessage)('Hello World!');
    end;
      

  9.   

    2 XiaoRong2sxh(不是我笨,是别人太聪明了!!) >>function可以做左值,procedure不可以,
    >>function和procedure都可以做右值不知道是否记错了,可以在赋值操作符(:=)左边的称为左值,可以在右边的称为右值
    如果是这样的话,function怎么可以做左值呢你说的function和procedure都可以做右值
    那是他们的地址可以作为右值,任何地址都是可以作为右值的
      

  10.   

    To jorge(失恋狂牛仔): 开始觉得讨论这些意义不大,但是看到你的论断,确实很详细,精僻。 我想可能大家都遇到过自己设计了一个过程序(当然就是副作用了),后在程序设计时发现如果些过程执行失败下面的执行就没有一点意议,怎么办又得改成有返回值的函数。但这个函数里已经不再是0副作用了。 如果象你说的那样,实现过程的副用用没什么问题,但要实现函数的o副作用很难。你说呢?
      

  11.   

    哦,关于函数和过程其实一样的,只不过函数可以返回值,但是procedure也可以有返回值的,只要利用全局变量或者是用var来定义参数就可以使该参数的数据得以保留了。关于再深点的,建议你去参考Pascal精要等书籍,那里面讲的很详细的。