参数还是变量?

197

我经常发现自己对术语“arguments”和“parameters”的使用感到困惑。 在编程世界中,它们似乎可以互换使用。

它们的正确使用惯例是什么?


仅供参考,一个密切相关的问题:https://dev59.com/5HVC5IYBdhLWcg3w4VRz(这是针对C#特定的,而这个则是与语言无关的;除此之外基本相同。) - Jonik
@Jonik: 这不是仅限于C#,因为发帖者也问及其他编程语言中的术语。另一个问题已经存在较长时间,而且(在我看来)有一些更好的答案。 - Mechanical snail
1
如果我们将其视为与特定编程语言无关的,则它确实是一个完全相同的副本。 - Mechanical snail
12个回答

215

参数是函数定义的作为输入的东西,而参数则是作为参数传递的东西。

void foo(int bar) { ... }

foo(baz);

在这个例子中,barfoo 的一个参数。 baz 是传递给 foo 的一个参数。


11
Rinat已经给出了正式的定义,你的说法并不是完全错误,但也不太准确。 - avgvstvs

204

参数是在函数声明中的变量:

functionName(parameter) {
    // do something
}


一个参数是传递给函数的实际变量值:

functionName(argument);

30
这是正式而正确的解释。 - avgvstvs
7
啊,所以一个“参数”是一个“形式参数”,而一个“参数”是一个“实际参数”。;-) - Adrian McCarthy

29

对于用户user1515422,以下是一个非常具体的示例,展示了参数和参数值之间的区别:

考虑这个函数:

int divide(int numerator, int denominator) {
    return numerator/denominator;
}

该函数有两个参数: numeratordenominator,在定义时就已经确定。一旦定义,函数的参数就是固定的,不会改变。

现在考虑对该函数的调用:

int result = divide(8, 4);

在这种情况下,84是传递给函数的参数numerator参数设置为参数8的值,而denominator设置为4。然后使用参数设置为参数值来评估函数。您可以将该过程视为等效于:

int divide() {
    int numerator = 8;
    int denominator = 4;
    return numerator/denominator;
}

参数和参数的区别类似于变量和它的值之间的区别。如果我写下 int x = 5;,那么变量是x,值是5。会出现混淆的情况,因为通常会简洁地说“x是五”,作为“变量x具有值5”的说法,但希望这种区别是清晰的。

这样清楚了吗?


15

当你调用一个子例程时,参数是你所拥有的内容。而在子例程内部访问的则是参数。

argle(foo, bar);

foobar 是参数。

public static void main(final String[] args) {
    args.length;
}

args是一个参数。


1
"args是一个参数。" 你觉得args作为参数的名称选得好吗? - Liam
@Liam 我可能不会选择它,但那是惯例,所以我坚持遵循它以避免混淆。 - Hank Gay
10
稍晚了一些,但是:args是一个参数,但它的内容是在命令行上传递给程序启动的参数。把它称为“参数”是不正确的,因为虽然方法签名中的变量本身是一个参数,但该数组的内容(在运行时)不是参数。 - ColinD

6

参数维基百科文章中有一个非常好的章节关于这个主题。

简而言之——参数是函数定义的形式名称,参数值是传递给函数的实际值(例如5)或事物(例如变量)。


4
尽管维基百科并非权威来源,但它做了一个不错的解释术语

我想你可以这样说,参数就像类与对象实例之间的关系一样,是对于参数的论述和对于参数的实际值之间的区别。...


2
当您定义一个函数时,例如:
MyFunction(param1,param2) {
  print parameter1, parameter
}

您在定义函数时设置参数。当您像这样调用函数时:
MyFunction('argument1', 'argument2');

您需要将参数的值设置为您传递的参数。参数是您在调用时放入问题中的内容。希望这有所帮助。


1
在大多数情况下,过程需要一些关于其被调用的情况的信息。执行重复或共享任务的过程为每次调用使用不同的信息。这些信息包括变量、常量和表达式,当您调用过程时,将这些信息传递给过程。
为了将这些信息传递给过程,过程定义了一个参数,调用代码向该参数传递一个参数值。您可以将参数视为停车位,将参数值视为汽车。就像不同的汽车可以在不同的时间停放在停车位上一样,调用代码可以在每次调用过程时向相同的参数传递不同的参数值。
参数
参数表示过程期望您在调用它时传递的值。过程的声明定义了它的参数。
当您定义一个函数或子过程时,您需要在过程名称后紧随其后的括号中指定参数列表。对于每个参数,您需要指定一个名称、数据类型和传递机制(ByVal 或 ByRef)。您还可以指示参数是可选的,这意味着调用代码不必为其传递值。
每个参数的名称在过程内部作为局部变量。您可以像使用任何其他变量一样使用参数名称。
参数值

参数代表您在调用过程时传递给过程参数的值。调用代码在调用过程时提供参数。

当您调用函数子过程时,您需要在过程名称后紧随其后的括号中包含一个参数列表。每个参数对应于列表中相同位置的参数。

与参数定义相反,参数没有名称。每个参数都是一个表达式,可以包含零个或多个变量、常量和文字。评估表达式的数据类型通常应与相应参数定义的数据类型匹配,在任何情况下,它必须能够转换为参数类型。


1

其实没有太大的区别。如果我们深入了解,我们可以找到不同之处。主要是我们知道参数/签名都是相同的。

基本上,参数定义了我们传递的数据类型。而参数则定义了我们传递的实际数据/变量。

参数示例:

int add(int a,int b){ //Here a and be both can treated as Parameter
 return a+b;
}

参数示例:

int return_result=add(3,4); // Here 3 and 4 both can treated as Argument

or

int x=3,y=4;
int return_result=add(x,y);// Here x and y both can treated as Argument

0
变量是一个存储位置和相关联的符号名称(标识符),其中包含数据、值。
参数是传递给函数的变量。
参数是传递给函数的数据(值)。
$variable = 'data/value';

function first($variable){ ... }

function second('data/value'){ ... }
function third(16){ ... }

在函数 first 中,我们正在传递一个参数。

在函数 second 和 third 中,我们正在传递参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接