Parameter (computer programming)
In
Unlike argument in usual mathematical usage, the argument in computer science is the actual input expression passed/supplied to a function, procedure, or routine in the invocation/call statement, whereas the parameter is the variable inside the implementation of the subroutine. For example, if one defines the add
subroutine as def add(x, y): return x + y
, then x, y
are parameters, while if this is called as add(2, 3)
, then 2, 3
are the arguments. Variables (and expressions thereof) from the calling context can be arguments: if the subroutine is called as a = 2; b = 3; add(a, b)
then the variables a, b
are the arguments, not the values 2, 3
. See the Parameters and arguments section for more information.
The semantics for how parameters can be declared and how the (value of) arguments are passed to the parameters of subroutines are defined by the
Example
The following program in the
double SalesTax(double price)
{
return 0.05 * price;
}
After the function has been defined, it can be invoked as follows:
SalesTax(10.00);
In this example, the function has been invoked with the argument 10.00. When this happens, 10.00 will be assigned to price, and the function begins calculating its result. The steps for producing the result are specified below, enclosed in {}. 0.05 * price
indicates that the first thing to do is multiply 0.05 by the value of price, which gives 0.50. return
means the function will produce the result of 0.05 * price
. Therefore, the final result (ignoring possible round-off errors one encounters with representing decimal fractions as binary fractions) is 0.50.
Parameters and arguments
The terms parameter and argument may have different meanings in different programming languages. Sometimes they are used interchangeably, and the context is used to distinguish the meaning. The term parameter (sometimes called formal parameter) is often used to refer to the variable as found in the function
Parameters appear in procedure definitions; arguments appear in procedure calls. In the function definition f(x) = x*x
the variable x is a parameter; in the function call f(2)
the value 2 is the argument of the function. Loosely, a parameter is a type, and an argument is an instance.
A parameter is an intrinsic property of the procedure, included in its definition. For example, in many languages, a procedure to add two supplied integers together and calculate the sum would need two parameters, one for each integer. In general, a procedure may be defined with any number of parameters, or no parameters at all. If a procedure has parameters, the part of its definition that specifies the parameters is called its parameter list.
By contrast, the arguments are the expressions[6] supplied to the procedure when it is called, usually one expression matching one of the parameters. Unlike the parameters, which form an unchanging part of the procedure's definition, the arguments may vary from call to call. Each time a procedure is called, the part of the procedure call that specifies the arguments is called the argument list.
Although parameters are also commonly referred to as arguments, arguments are sometimes thought of as the actual values or references assigned to the parameter variables when the subroutine is called at
void ThreadFunction(void* pThreadArgument)
{
// Naming the first parameter 'pThreadArgument' is correct, rather than
// 'pThreadParameter'. At run time the value we use is an argument. As
// mentioned above, reserve the term parameter for when discussing
// subroutine definitions.
}
To better understand the difference, consider the following function written in C:
int Sum(int addend1, int addend2)
{
return addend1 + addend2;
}
The function Sum has two parameters, named addend1 and addend2. It adds the values passed into the parameters, and returns the result to the subroutine's caller (using a technique automatically supplied by the C compiler).
The code which calls the Sum function might look like this:
int value1 = 40;
int value2 = 2;
int sum_value = Sum(value1, value2);
The variables value1 and value2 are initialized with values. value1 and value2 are both arguments to the sum function in this context.
At runtime, the values assigned to these variables are passed to the function Sum as arguments. In the Sum function, the parameters addend1 and addend2 are evaluated, yielding the arguments 40 and 2, respectively. The values of the arguments are added, and the result is returned to the caller, where it is assigned to the variable sum_value.
Because of the difference between parameters and arguments, it is possible to supply inappropriate arguments to a procedure. The call may supply too many or too few arguments; one or more of the arguments may be a wrong type; or arguments may be supplied in the wrong order. Any of these situations causes a mismatch between the parameter and argument lists, and the procedure will often return an unintended answer or generate a
Alternative convention in Eiffel
Within the Eiffel software development method and language, the terms argument and parameter have distinct uses established by convention. The term argument is used exclusively in reference to a routine's inputs,[7] and the term parameter is used exclusively in type parameterization for generic classes.[8]
Consider the following routine definition:
sum (addend1: INTEGER; addend2: INTEGER): INTEGER
do
Result := addend1 + addend2
end
The routine sum
takes two arguments addend1
and addend2
, which are called the routine's formal arguments. A call to sum
specifies actual arguments, as shown below with value1
and value2
.
sum_value: INTEGER
value1: INTEGER = 40
value2: INTEGER = 2
…
sum_value := sum (value1, value2)
Parameters are also thought of as either formal or actual. Formal generic parameters are used in the definition of generic classes. In the example below, the class HASH_TABLE
is declared as a generic class which has two formal generic parameters, G
representing data of interest and K
representing the hash key for the data:
class HASH_TABLE [G, K -> HASHABLE]
…
When a class becomes a client to HASH_TABLE
, the formal generic parameters are substituted with actual generic parameters in a generic derivation. In the following attribute declaration, my_dictionary
is to be used as a character string based dictionary. As such, both data and key formal generic parameters are substituted with actual generic parameters of type STRING
.
my_dictionary: HASH_TABLE [STRING, STRING]
Datatypes
In
Some languages use a special keyword (e.g. void) to indicate that the subroutine has no parameters; in formal type theory, such functions take an empty parameter list (whose type is not void, but rather unit).
Argument passing
The exact mechanism for assigning arguments to parameters, called argument passing, depends upon the
Default arguments
Some programming languages such as
PowerShell example:
function doc($g = 1.21) {
"$g gigawatts? $g gigawatts? Great Scott!"
}
PS > doc
1.21 gigawatts? 1.21 gigawatts? Great Scott!
PS > doc 88
88 gigawatts? 88 gigawatts? Great Scott!
Default arguments can be seen as a special case of the variable-length argument list.
Variable-length parameter lists
Some languages allow subroutines to be defined to accept a variable number of arguments. For such languages, the subroutines must iterate through the list of arguments.
PowerShell example:
function marty {
$args | foreach { "back to the year $_" }
}
PS > marty 1985
back to the year 1985
PS > marty 2015 1985 1955
back to the year 2015
back to the year 1985
back to the year 1955
Named parameters
Some programming languages—such as
PowerShell example:
function jennifer($adjectiveYoung, $adjectiveOld) {
"Young Jennifer: I'm $adjectiveYoung!"
"Old Jennifer: I'm $adjectiveOld!"
}
PS > jennifer 'fresh' 'experienced'
Young Jennifer: I'm fresh!
Old Jennifer: I'm experienced!
PS > jennifer -adjectiveOld 'experienced' -adjectiveYoung 'fresh'
Young Jennifer: I'm fresh!
Old Jennifer: I'm experienced!
Multiple parameters in functional languages
In
Output parameters
An output parameter, also known as an out parameter or return parameter, is a parameter used for output, rather than the more usual use for input. Using
More precisely, one may distinguish three types of parameters or parameter modes: input parameters, output parameters, and input/output parameters; these are often denoted in
, out
, and in out
or inout
. An input argument (the argument to an input parameter) must be a value, such as an initialized variable or literal, and must not be redefined or assigned to; an output argument must be an assignable variable, but it need not be initialized, any existing value is not accessible, and must be assigned a value; and an input/output argument must be an initialized, assignable variable, and can optionally be assigned a value. The exact requirements and enforcement vary between languages – for example, in
In some cases only input and input/output are distinguished, with output being considered a specific use of input/output, and in other cases only input and output (but not input/output) are supported. The default mode varies between languages: in Fortran 90 input/output is default, while in C# and SQL extensions input is default, and in TScript each parameter is explicitly specified as input or output.
Syntactically, parameter mode is generally indicated with a keyword in the function declaration, such as void f(out int x)
in C#. Conventionally output parameters are often put at the end of the parameter list to clearly distinguish them, though this is not always followed. TScript uses a different approach, where in the function declaration input parameters are listed, then output parameters, separated by a colon (:) and there is no return type to the function itself, as in this function, which computes the size of a text fragment:
TextExtent(WString text, Font font : Integer width, Integer height)
Parameter modes are a form of denotational semantics, stating the programmer's intent and allowing compilers to catch errors and apply optimizations – they do not necessarily imply operational semantics (how the parameter passing actually occurs). Notably, while input parameters can be implemented by call by value, and output and input/output parameters by call by reference – and this is a straightforward way to implement these modes in languages without built-in support – this is not always how they are implemented. This distinction is discussed in detail in the Ada '83 Rationale, which emphasizes that the parameter mode is abstracted from which parameter passing mechanism (by reference or by copy) is actually implemented.[11] For instance, while in C# input parameters (default, no keyword) are passed by value, and output and input/output parameters (out
and ref
) are passed by reference, in PL/SQL input parameters (IN
) are passed by reference, and output and input/output parameters (OUT
and IN OUT
) are by default passed by value and the result copied back, but can be passed by reference by using the NOCOPY
compiler hint.[16]
A syntactically similar construction to output parameters is to assign the
function f(x, y: integer): integer;
begin
f := x + y;
end;
This is semantically different in that when called, the function is simply evaluated – it is not passed a variable from the calling scope to store the output in.
Use
The primary use of output parameters is to return multiple values from a function, while the use of input/output parameters is to modify state using parameter passing (rather than by shared environment, as in global variables). An important use of returning multiple values is to solve the semipredicate problem of returning both a value and an error status – see Semipredicate problem: Multivalued return.
For example, to return two variables from a function in C, one may write:
int width
int height;
F(x, &width, &height);
where x
is an input parameter and width
and height
are output parameters.
A common use case in C and related languages is for exception handling, where a function places the return value in an output variable, and returns a Boolean corresponding to whether the function succeeded or not. An archetypal example is the TryParse
method in .NET, especially C#, which parses a string into an integer, returning true
on success and false
on failure. This has the following signature:[17]
public static bool TryParse(string s, out int result)
and may be used as follows:
int result;
if (!Int32.TryParse(s, result)) {
// exception handling
}
Similar considerations apply to returning a value of one of several possible types, where the return value can specify the type and then value is stored in one of several output variables.
Drawbacks
Output parameters are often discouraged in modern programming, essentially as being awkward, confusing, and too low-level – commonplace return values are considerably easier to understand and work with.[18] Notably, output parameters involve functions with side effects (modifying the output parameter) and are semantically similar to references, which are more confusing than pure functions and values, and the distinction between output parameters and input/output parameters can be subtle. Further, since in common programming styles most parameters are simply input parameters, output parameters and input/output parameters are unusual and hence susceptible to misunderstanding.
Output and input/output parameters prevent function composition, since the output is stored in variables, rather than in the value of an expression. Thus one must initially declare a variable, and then each step of a chain of functions must be a separate statement. For example, in C++ the following function composition:
Object obj = G(y, F(x));
when written with output and input/output parameters instead becomes (for F
it is an output parameter, for G
an input/output parameter):
Object obj;
F(x, &obj);
G(y, &obj);
In the special case of a function with a single output or input/output parameter and no return value, function composition is possible if the output or input/output parameter (or in C/C++, its address) is also returned by the function, in which case the above becomes:
Object obj;
G(y, F(x, &obj));
Alternatives
There are various alternatives to the use cases of output parameters.
For returning multiple values from a function, an alternative is to return a
def f():
return 1, 2
a, b = f()
For returning a value of one of several types, a tagged union can be used instead; the most common cases are nullable types (option types), where the return value can be null to indicate failure. For exception handling, one can return a nullable type, or raise an exception. For example, in Python one might have either:
result = parse(s)
if result is None:
# exception handling
or, more idiomatically:
try:
result = parse(s)
except ParseError:
# exception handling
The micro-optimization of not requiring a local variable and copying the return when using output variables can also be applied to conventional functions and return values by sufficiently sophisticated compilers.
The usual alternative to output parameters in C and related languages is to return a single data structure containing all return values.[13] For example, given a structure encapsulating width and height, one can write:
WidthHeight width_and_height = F(x);
In object-oriented languages, instead of using input/output parameters, one can often use
See also
- Command-line argument
- Evaluation strategy
- Operator overloading
- Free variables and bound variables
Notes
- ^ In this article, the term "subroutine" refers to any subroutine-like construct, which have different names and slightly different meanings depending on the programming language being discussed.
- ^ C and C++ are call by value, but if type is a reference (a C/C++ pointer or C++ reference), then setting the value of the reference can be used to produce call by reference style behavior.
References
- ^ "Passing Information to a Method or a Constructor (Learning the Java Language > Classes and Objects)". The Java™ Tutorials. Retrieved 2021-09-09.
Parameters refers to the list of variables in a method declaration. Arguments are the actual values that are passed in when the method is invoked. When you invoke a method, the arguments used must match the declaration's parameters in type and order.
- ISBN 978-0-672-32696-7.
- ^ "Working Draft, Standard for Programming Language C++" (PDF). Open Standards. 2005-10-19. Archived from the original (PDF) on December 14, 2005. Retrieved 1 January 2018.
- ^ Gordon, Aaron. "Subprograms and Parameter Passing". rowdysites.msudenver.edu/~gordona. Archived from the original on 1 January 2018. Retrieved 1 January 2018.
- ^ Dollard, Kathleen. "Passing Arguments by Value and by Reference (Visual Basic)". Microsoft Learn. Retrieved 2018-10-27.
- ^ "The GNU C Programming Tutorial". crasseux.com. Retrieved 2018-10-27.
- ^ Meyer, Bertrand. Object-Oriented Software Construction, 2nd Edition, Prentice Hall, 1997, p 444.
- ^ Meyer, p. 96.
- ^ "Functions". gigamonkeys.com. Retrieved 2021-06-02.
- ^ "optional arguments". www.netlib.org. Retrieved 2021-06-02.
- ^ a b 8.2 Parameter Modes, "Rationale for the Design of the Ada® Programming Language"
- ^ 8. PL/SQL Subprograms: Specifying Subprogram Parameter Modes
- ^ a b Peter Hallam. "Why does C# have both 'ref' and 'out'?". Archived from the original on 2011-09-26.
- ^ ParameterDirection Enumeration
- ^ Functions — The Swift Programming Language (Swift 4.2)
- ^ 8. PL/SQL Subprograms: Passing Large Data Structures with the NOCOPY Compiler Hint
- ^ Int32.TryParse Method (String, Int32)
- ^ a b CA1021: Avoid out parameters