Assignment and compound assignment operators are binary operators that modify the variable to their left using the value to their right.
| Operator | Operator name | Example | Description | Equivalent of |
|---|---|---|---|---|
| = | basic assignment | a= b | a becomes equal tob | N/A |
| += | addition assignment | a+= b | a becomes equal to the addition ofa andb | a= a+ b |
| -= | subtraction assignment | a-= b | a becomes equal to the subtraction ofb froma | a= a- b |
| *= | multiplication assignment | a*= b | a becomes equal to the product ofa andb | a= a* b |
| /= | division assignment | a/= b | a becomes equal to the division ofa byb | a= a/ b |
| %= | modulo assignment | a%= b | a becomes equal to the remainder ofa divided byb | a= a% b |
| &= | bitwise AND assignment | a&= b | a becomes equal to the bitwise AND ofa andb | a= a& b |
| |= | bitwise OR assignment | a|= b | a becomes equal to the bitwise OR ofa andb | a= a| b |
| ^= | bitwise XOR assignment | a^= b | a becomes equal to the bitwise XOR ofa andb | a= a^ b |
| <<= | bitwise left shift assignment | a<<= b | a becomes equal toa left shifted byb | a= a<< b |
| >>= | bitwise right shift assignment | a>>= b | a becomes equal toa right shifted byb | a= a>> b |
Contents |
The simple assignment operator expressions have the form
lhs=rhs | |||||||||
where
| lhs | - | modifiable lvalue expression of any complete object type |
| rhs | - | expression of any typeimplicitly convertible tolhs orcompatible withlhs |
Assignment performsimplicit conversion from the value ofrhs to the type oflhs and then replaces the value in the object designated bylhs with the converted value ofrhs.
Assignment also returns the same value as what was stored inlhs (so that expressions such asa= b= c are possible). Thevalue category of the assignment operator is non-lvalue (so that expressions such as(a=b)=c are invalid).
rhs andlhs must satisfy one of the following:
| (since C99) |
| (since C23) |
Ifrhs andlhs overlap in memory (e.g. they are members of the same union), the behavior is undefined unless the overlap is exact and the types arecompatible.
Although arrays are not assignable, an array wrapped in a struct is assignable to another object of the same (or compatible) struct type.
The side effect of updatinglhs issequenced after the value computations, but not the side effects oflhs andrhs themselves and the evaluations of the operands are, as usual, unsequenced relative to each other (so the expressions such asi=++i; are undefined)
Assignment strips extra range and precision from floating-point expressions (seeFLT_EVAL_METHOD).
In C++, assignment operators are lvalue expressions, not so in C.
#include <stdio.h> int main(void){// integersint i=1, j=2, k=3;// initialization, not assignment i= j= k;// values of i and j are now 3// (i = j) = k; // Error: lvalue requiredprintf("%d %d %d\n", i, j, k); // pointersconstchar c='A';// initialization; not assignmentconstchar*p=&c;// initialization; not assignmentconstchar**cpp=&p;// initialization; not assignment // cpp = &p; // Error: char** is not convertible to const char***cpp=&c;// OK, char* is convertible to const char*printf("%c\n",**cpp); cpp=0;// OK, null pointer constant is convertible to any pointer // arraysint arr1[2]={1,2}, arr2[2]={3,4};// arr1 = arr2; // Error: cannot assign to an arrayprintf("arr1[0]=%d arr1[1]=%d arr2[0]=%d arr2[1]=%d\n", arr1[0], arr1[1], arr2[0], arr2[1]); struct{int arr[2];} sam1={{5,6}}, sam2={{7,8}}; sam1= sam2;// OK: can assign arrays wrapped in structs printf("%d %d\n", sam1.arr[0], sam1.arr[1]);}
Output:
3 3 3Aarr1[0]=1 arr1[1]=2 arr2[0]=3 arr2[1]=47 8
The compound assignment operator expressions have the form
| lhsoprhs | |||||||||
where
| op | - | one of*=,/=%=,+=-=,<<=,>>=,&=,^=,|= |
| lhs,rhs | - | expressions witharithmetic types (wherelhs may be qualified or atomic), except whenop is+= or-=, which also accept pointer types with the same restrictions as + and - |
The expressionlhs@=rhs is exactly the same aslhs=lhs@(rhs), except thatlhs is evaluated only once.
Iflhs hasatomic type, the operation behaves as a single atomic read-modify-write operation with memory ordermemory_order_seq_cst. For integer atomic types, the compound assignment@= is equivalent to: T1* addr=&lhs;T2 val= rhs;T1 old=*addr;T1 new;do{ new= old @ val}while(!atomic_compare_exchange_strong(addr,&old, new); | (since C11) |
Output:
10 100 10 5010 1000 1 0
| Common operators | ||||||
|---|---|---|---|---|---|---|
| assignment | increment decrement | arithmetic | logical | comparison | member access | other |
a= b | ++a | +a | !a | a== b | a[b] | a(...) |
C++ documentation forAssignment operators |