一般来说,我们都听说过编程语言中的函数或过程.但是,我发现我几乎可以互换地使用这些术语(这可能是非常错误的).
所以,我的问题是:
它们的功能,用途和用途有何不同?
一个例子将不胜感激.
函数返回一个值,一个过程只执行命令.
名称功能来自数学.它用于根据输入计算值.
过程是一组可以按顺序执行的命令.
在大多数编程语言中,甚至函数都可以有一组命令.因此,差异仅在于返回值部分.
但是如果你想保持一个功能干净,(只看功能语言),你需要确保一个功能没有副作用.
这取决于具体情况.
在类似Pascal的语言中,函数和过程是不同的实体,不同的是它们是否返回值.他们表现得与众不同.语言语法(例如,过程调用表单语句;您不能在表达式中使用过程调用,而函数调用不会形成语句,您必须在其他语句中使用它们).因此,Pascal-bred程序员区分它们.
在类C语言和许多其他当代语言中,这种区别已经消失; 在静态类型语言中,过程只是具有有趣返回类型的函数.这可能是他们互换使用的原因.
在函数式语言中,通常没有程序这样的东西 - 一切都是函数.
C中的示例:
// function int square( int n ) { return n * n; } // procedure void display( int n ) { printf( "The value is %d", n ); }
虽然你应该注意C标准不讨论程序,只讨论函数.
通常,过程是一系列指令.
函数可以相同,但通常返回结果.
有一个术语子程序或子程序,它代表可以从不同位置调用的参数化代码段.
功能和程序是这些的实现.通常函数返回值和过程不返回任何内容.
Function必须返回一个值,但在Stored Procedures中它是可选的:一个过程可以返回0或n值.
函数只能有输入参数,而过程可以有输入/输出参数.
对于函数,必须采用一个输入参数,但存储过程可能需要0到n个输入参数.
可以从过程调用函数,而无法从函数调用过程.
异常可以通过过程中的try-catch块来处理,而try-catch块不能在Function中使用.
我们可以在一个过程中进行事务管理,而在一个函数中我们不能.
程序允许SELECT
以及DML( ,INSERT
,UPDATE
)DELETE
在其声明,而功能只允许SELECT
声明它.
程序不能在SELECT
语句中使用,而函数可以嵌入SELECT
语句中.
存储过程不能在WHERE
(或一个HAVING
或多个SELECT
)块中的任何位置的SQL语句中使用,而函数可以.
返回表的函数可以视为另一个Rowset.这可以在JOIN
与其他表的块中使用.
内联函数可以被视为带参数的视图,可以在JOIN
块和其他Rowset操作中使用.
更严格的是,如果x = y,函数f服从f(x)= f(y)的属性,即每次用相同的参数调用它时计算相同的结果(因此它不会改变状态系统.)
因此,rand()或print("Hello")等不是函数而是程序.虽然sqrt(2.0)应该是一个函数:没有可观察到的效果或状态改变,无论多少次调用它,它总是返回1.41和一些.