Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 4699|回复: 2

谁能讲讲过程和函数的主作用和副作用是什么?

[复制链接]

该用户从未签到

发表于 2010-12-9 10:08:58 | 显示全部楼层 |阅读模式
谁能讲讲过程和函数的主作用和副作用是什么?
回复

使用道具 举报

该用户从未签到

发表于 2011-1-10 14:16:47 | 显示全部楼层
过程没返回值,函数有返回值;主作用是按你想的调用序列求值,副作用是嵌套调用时求值顺序未定义。举例:
function addOne(var x:integer,var y:integer):integer;
begin
    inc(x);
    inc(y);
    addOne:=x+y;
end;
function addTwo(var x:integer,var y:integer):integer;
begin
   x:=x+2;
  y:=y+2;
   addTwo:=x+y;
end;

var
a:integer;
b:integer;
retval:integer;

begin
a:=10;
b:=11;
retval:=addOne(addTwo(a,b),addOne(b,a));
中间a和b 求值时间和顺序是系统未定义的。所以不同系统retval应该不同(54 或者53)。安全的作法是分开两步求值:
...
var
...
r1:integer;
r2:integer;
..
r1:=addTwo(a,b);
r2:=addOne(b,a);
retval:=addOne(r1,r2);

免责声明:以上代码未经测试,完全凭个人理解,对使用该代码所造成的任何损失,如硬盘被格式化,让你的Win7变成了Ubuntu,网银密码被盗,丢失女朋友等,本人概不负责。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-1-29 18:59:48 | 显示全部楼层
不知道您說的副作用是不是指 side effect; 如果是这样的话, 有 side effect 的函数基本上是指造成状态改变的函数。 比如函数 function f(x: Integer): Integer; begin y := y + x; Result := x + y end; 就修改了 f 外部的变量 y, 其结果是多次调用 f, 输入相同, 输出会不一样。 像是依赖於全局变量的函数比如 Random() 之类, 也是有副作用的函数。 产生输出的函数也是如此。

没有副作用的函数叫做纯函数 (pure function)。 数学上的函数都是纯函数。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 13:31 , Processed in 0.064981 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表