''x'' = ''expr''
(originally ''x'' := ''expr''
(originally Semantics
An assignment operation is a process inMOVE
or STORE
.Crossing borders: Explore functional programming with Haskell''expression''
is evaluated in the current state of the program.
* The ''variable''
is assigned the computed value, replacing the prior value of that variable.
Example: Assuming that a
is a numeric variable, the assignment a := 2*a
means that the content of the variable a
is doubled after the execution of the statement.
An example segment of C code:
x
is first declared as an int, and is then assigned the value of 10. Notice that the declaration and assignment occur in the same statement. In the second line, y
is declared without an assignment. In the third line, x
is reassigned the value of 23. Finally, y
is assigned the value of 32.4.
For an assignment operation, it is necessary that the value of the ''expression''
is well-defined (it is a valid rvalue) and that the ''variable''
represents a modifiable entity (it is a valid modifiable (non-Single assignment
Any assignment that changes an existing value (e.g.x := x + 1
) is disallowed in purely functional languages. In let
) and true assignment (with set!
) can be used on all variables, and specialized primitives are provided for destructive update inside lists, vectors, strings, etc. In OCaml, only single assignment is allowed for variables, via the let ''name'' = ''value''
syntax; however destructive update can be used on elements of arrays and strings with separate <-
operator, as well as on fields of records and objects that have been explicitly declared Value of an assignment
In some programming languages, an assignment statement returns a value, while in others it does not. In mostx = y = a
, in which the assignment statement y = a
returns the value of a
, which is then assigned to x
. In a statement such as , the return value of a function is used to control a loop while assigning that same value to a variable.
In other programming languages, ()
. This type has only one possible value, therefore containing no information. It is typically the type of an expression that is evaluated purely for its side effects.
Variant forms of assignment
Certain use patterns are very common, and thus often have special syntax to support them. These are primarilyAugmented assignment
The case where the assigned value depends on a previous one is so common that many imperative languages, most notably C and the majority of its descendants, provide special operators called*=
, so a = 2*a
can instead be written as a *= 2
. Beyond syntactic sugar, this assists the task of the compiler by making clear that in-place modification of the variable a
is possible.
Chained assignment
A statement likew = x = y = z
is called a chained assignment in which the value of z
is assigned to multiple variables w, x,
and y
. Chained assignments are often used to initialize multiple variables, as in
a = b = c = d = f = 0
Not all programming languages support chained assignment. Chained assignments are equivalent to a sequence of assignments, but the evaluation strategy differs between languages. For simple chained assignments, like initializing multiple variables, the evaluation strategy does not matter, but if the targets (l-values) in the assignment are connected in some way, the evaluation strategy affects the result.
In some programming languages ( C for example), chained assignments are supported because assignments are expressions, and have values. In this case chain assignment can be implemented by having a right-associative assignment, and assignments happen right-to-left. For example, i = arr = f()
is equivalent to arr = f(); i = arr /code>. In C++
C++ (pronounced "C plus plus") is a high-level general-purpose programming language created by Danish computer scientist Bjarne Stroustrup as an extension of the C programming language, or "C with Classes". The language has expanded significan ...
they are also available for values of class types by declaring the appropriate return type for the assignment operator.
In Python
Python may refer to:
Snakes
* Pythonidae, a family of nonvenomous snakes found in Africa, Asia, and Australia
** ''Python'' (genus), a genus of Pythonidae found in Africa and Asia
* Python (mythology), a mythical serpent
Computing
* Python (pro ...
, assignment statements are not expressions and thus do not have a value. Instead, chained assignments are a series of statements with multiple targets for a single expression. The assignments are executed left-to-right so that i = arr = f()
evaluates the expression f()
, then assigns the result to the leftmost target, i
, and then assigns the same result to the next target, arr /code>, using the new value of i
. This is essentially equivalent to tmp = f(); i = tmp; arr = tmp
though no actual variable is produced for the temporary value.
Parallel assignment
Some programming languages, such as APL, Common Lisp
Common Lisp (CL) is a dialect of the Lisp programming language, published in ANSI standard document ''ANSI INCITS 226-1994 (S20018)'' (formerly ''X3.226-1994 (R1999)''). The Common Lisp HyperSpec, a hyperlinked HTML version, has been derived fro ...
, Go, JavaScript
JavaScript (), often abbreviated as JS, is a programming language that is one of the core technologies of the World Wide Web, alongside HTML and CSS. As of 2022, 98% of Website, websites use JavaScript on the Client (computing), client side ...
(since 1.7), PHP
PHP is a general-purpose scripting language geared toward web development. It was originally created by Danish-Canadian programmer Rasmus Lerdorf in 1993 and released in 1995. The PHP reference implementation is now produced by The PHP Group ...
, Maple
''Acer'' () is a genus of trees and shrubs commonly known as maples. The genus is placed in the family Sapindaceae.Stevens, P. F. (2001 onwards). Angiosperm Phylogeny Website. Version 9, June 2008 nd more or less continuously updated since http ...
, Lua
Lua or LUA may refer to:
Science and technology
* Lua (programming language)
* Latvia University of Agriculture
* Last universal ancestor, in evolution
Ethnicity and language
* Lua people, of Laos
* Lawa people, of Thailand sometimes referred t ...
, occam 2
occam is a programming language which is concurrent and builds on the communicating sequential processes (CSP) process algebra, Inmos document 72 occ 45 03 and shares many of its features. It is named after philosopher William of Ockham after wh ...
, Perl
Perl is a family of two high-level, general-purpose, interpreted, dynamic programming languages. "Perl" refers to Perl 5, but from 2000 to 2019 it also referred to its redesigned "sister language", Perl 6, before the latter's name was offici ...
, Python
Python may refer to:
Snakes
* Pythonidae, a family of nonvenomous snakes found in Africa, Asia, and Australia
** ''Python'' (genus), a genus of Pythonidae found in Africa and Asia
* Python (mythology), a mythical serpent
Computing
* Python (pro ...
, REBOL, Ruby
A ruby is a pinkish red to blood-red colored gemstone, a variety of the mineral corundum ( aluminium oxide). Ruby is one of the most popular traditional jewelry gems and is very durable. Other varieties of gem-quality corundum are called sa ...
, and PowerShell
PowerShell is a task automation and configuration management program from Microsoft, consisting of a command-line shell (computing), shell and the associated scripting language. Initially a Windows component only, known as Windows PowerShell, it ...
allow several variables to be assigned in parallel, with syntax like:
a, b := 0, 1
which simultaneously assigns 0 to a
and 1 to b
. This is most often known as parallel assignment; it was introduced in CPL in 1963, under the name simultaneous assignment, and is sometimes called multiple assignment, though this is confusing when used with "single assignment", as these are not opposites. If the right-hand side of the assignment is a single variable (e.g. an array or structure), the feature is called unpacking or destructuring assignment:
var list :=
a, b := list
The list will be unpacked so that 0 is assigned to a
and 1 to b
. Furthermore,
a, b := b, a
swaps the values of a
and b
. In languages without parallel assignment, this would have to be written to use a temporary variable
var t := a
a := b
b := t
since a := b; b := a
leaves both a
and b
with the original value of b
.
Some languages, such as Go and Python, combine parallel assignment, tuples, and automatic tuple unpacking to allow multiple return values from a single function, as in this Python example,
def f():
return 1, 2
a, b = f()
while other languages, such as C# and Rust
Rust is an iron oxide, a usually reddish-brown oxide formed by the reaction of iron and oxygen in the catalytic presence of water or air moisture. Rust consists of hydrous iron(III) oxides (Fe2O3·nH2O) and iron(III) oxide-hydroxide (FeO(OH ...
, shown here, require explicit tuple construction and deconstruction with parentheses:
// Valid C# or Rust syntax
(a, b) = (b, a);
// C# tuple return
(string, int) f() => ("foo", 1);
var (a, b) = f();
// Rust tuple return
let f = , , ("foo", 1);
let (a, b) = f();
This provides an alternative to the use of output parameter
In computer programming, a parameter or a formal argument is a special kind of variable used in a subroutine to refer to one of the pieces of data provided as input to the subroutine. These pieces of data are the values of the arguments (often ca ...
s for returning multiple values from a function. This dates to CLU (1974), and CLU helped popularize parallel assignment generally.
C# additionally allows generalized ''deconstruction assignment'' with implementation defined by the expression on the right-hand side, as the compiler searches for an appropriate instance
Instantiation or instance may refer to:
Philosophy
* A modern concept similar to ''participation'' in classical Platonism; see the Theory of Forms
* The instantiation principle, the idea that in order for a property to exist, it must be had by ...
or extension
Extension, extend or extended may refer to:
Mathematics
Logic or set theory
* Axiom of extensionality
* Extensible cardinal
* Extension (model theory)
* Extension (predicate logic), the set of tuples of values that satisfy the predicate
* E ...
Deconstruct
method on the expression, which must have output parameters for the variables being assigned to. For example, one such method that would give the class
Class or The Class may refer to:
Common uses not otherwise categorized
* Class (biology), a taxonomic rank
* Class (knowledge representation), a collection of individuals or objects
* Class (philosophy), an analytical concept used differentl ...
it appears in the same behavior as the return value of f()
above would be
void Deconstruct(out string a, out int b)
In C and C++, the comma operator
In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type); there ...
is similar to parallel assignment in allowing multiple assignments to occur within a single statement, writing a = 1, b = 2
instead of a, b = 1, 2
.
This is primarily used in for loops, and is replaced by parallel assignment in other languages such as Go.
However, the above C++ code does not ensure perfect simultaneity, since the right side of the following code a = b, b = a+1
is evaluated after the left side. In languages such as Python, a, b = b, a+1
will assign the two variables concurrently, using the initial value of a to compute the new b.
Assignment versus equality
The use of the equals sign =
as an assignment operator has been frequently criticized, due to the conflict with equals as comparison for equality. This results both in confusion by novices in writing code, and confusion even by experienced programmers in reading code. The use of equals for assignment dates back to Heinz Rutishauser
Heinz Rutishauser (30 January 1918 – 10 November 1970) was a Swiss mathematician and a pioneer of modern numerical mathematics and computer science.
Life
Rutishauser's father died when he was 13 years old and his mother died three years lat ...
's language Superplan
Superplan was a high-level programming language developed between 1949 and 1951 by Heinz Rutishauser, the name being a reference to "Rechenplan" (i.e. computation plan), in Konrad Zuse's terminology designating a single Plankalkül program.
Th ...
, designed from 1949 to 1951, and was particularly popularized by Fortran:
Beginning programmers sometimes confuse assignment with the relational operator
In computer science, a relational operator is a programming language construct or operator that tests or defines some kind of relation between two entities. These include numerical equality (''e.g.'', ) and inequalities (''e.g.'', ).
In prog ...
for equality, as "=" means equality
Equality may refer to:
Society
* Political equality, in which all members of a society are of equal standing
** Consociationalism, in which an ethnically, religiously, or linguistically divided state functions by cooperation of each group's elite ...
in mathematics, and is used for assignment in many languages. But assignment alters the value of a variable, while equality testing tests whether two expressions have the same value.
In some languages, such as BASIC
BASIC (Beginners' All-purpose Symbolic Instruction Code) is a family of general-purpose, high-level programming languages designed for ease of use. The original version was created by John G. Kemeny and Thomas E. Kurtz at Dartmouth College ...
, a single equals sign ("="
) is used for both the assignment operator and the equality relational operator, with context determining which is meant. Other languages use different symbols for the two operators. For example:
* In ALGOL
ALGOL (; short for "Algorithmic Language") is a family of imperative computer programming languages originally developed in 1958. ALGOL heavily influenced many other languages and was the standard method for algorithm description used by the ...
and Pascal
Pascal, Pascal's or PASCAL may refer to:
People and fictional characters
* Pascal (given name), including a list of people with the name
* Pascal (surname), including a list of people and fictional characters with the name
** Blaise Pascal, Fren ...
, the assignment operator is a colon and an equals sign (":="
) while the equality operator is a single equals ("="
).
* In C, the assignment operator is a single equals sign ("="
) while the equality operator is a pair of equals signs (""
).
* In R, the assignment operator is basically <-
, as in x <- value
, but a single equals sign can be used in certain contexts.
The similarity in the two symbols can lead to errors if the programmer forgets which form ("=
", "
", ":=
") is appropriate, or mistypes "=
" when "
" was intended. This is a common programming problem with languages such as C (including one famous attempt to backdoor the Linux kernel), where the assignment operator also returns the value assigned (in the same way that a function returns a value), and can be validly nested inside expressions. If the intention was to compare two values in an if
statement, for instance, an assignment is quite likely to return a value interpretable as Boolean true, in which case the then
clause will be executed, leading the program to behave unexpectedly. Some language processors (such as gcc) can detect such situations, and warn the programmer of the potential error.
Notation
The two most common representations for the copying assignment are equals sign
The equals sign (British English, Unicode) or equal sign (American English), also known as the equality sign, is the mathematical symbol , which is used to indicate equality in some well-defined sense. In an equation, it is placed between two ...
(=
) and colon-equals (:=
). Both forms may semantically denote either an assignment ''statement'' or an assignment '' operator'' (which also has a value), depending on language and/or usage.
:
Other possibilities include a left arrow or a keyword, though there are other, rarer, variants:
:
Mathematical pseudo code
In computer science, pseudocode is a plain language description of the steps in an algorithm or another system. Pseudocode often uses structural conventions of a normal programming language, but is intended for human reading rather than machine re ...
assignments are generally depicted with a left-arrow.
Some platforms put the expression on the left and the variable on the right:
:
Some expression-oriented languages, such as Lisp
A lisp is a speech impairment in which a person misarticulates sibilants (, , , , , , , ). These misarticulations often result in unclear speech.
Types
* A frontal lisp occurs when the tongue is placed anterior to the target. Interdental lisping ...
and Tcl, uniformly use prefix (or postfix) syntax for all statements, including assignment.
:
See also
* Assignment operator in C++ In the C++ programming language, the assignment operator, =, is the operator used for assignment. Like most other operators in C++, it can be overloaded.
The copy assignment operator, often just called the "assignment operator", is a special case ...
* Operator (programming)
In computer programming, operators are constructs defined within programming languages which behave generally like functions, but which differ syntactically or semantically.
Common simple examples include arithmetic (e.g. addition with ), c ...
* Name binding
In programming languages, name binding is the association of entities (data and/or code) with identifiers. An identifier bound to an object is said to reference that object. Machine languages have no built-in notion of identifiers, but name-objec ...
* Unification (computing) In logic and computer science, unification is an algorithmic process of solving equations between symbolic expressions.
Depending on which expressions (also called ''terms'') are allowed to occur in an equation set (also called ''unification prob ...
* Immutable object
In object-oriented and functional programming, an immutable object (unchangeable object) is an object whose state cannot be modified after it is created.Goetz et al. ''Java Concurrency in Practice''. Addison Wesley Professional, 2006, Section 3.4 ...
* Const-correctness
In some programming languages, const is a type qualifier (a keyword applied to a data type) that indicates that the data is read-only. While this can be used to declare constants, in the C family of languages differs from similar constructs in ...
Notes
References
{{reflist, 2
Programming language concepts
Assignment operations
Articles with example C code