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 to b  N/A 
+=  addition assignment  a += b  a becomes equal to the addition of a and b  a = a + b 
=  subtraction assignment  a = b  a becomes equal to the subtraction of b from a  a = a  b 
*=  multiplication assignment  a *= b  a becomes equal to the product of a and b  a = a * b 
/=  division assignment  a /= b  a becomes equal to the division of a by b  a = a / b 
%=  modulo assignment  a %= b  a becomes equal to the remainder of a divided by b  a = a % b 
&=  bitwise AND assignment  a &= b  a becomes equal to the bitwise AND of a and b  a = a & b 
=  bitwise OR assignment  a = b  a becomes equal to the bitwise OR of a and b  a = a  b 
^=  bitwise XOR assignment  a ^= b  a becomes equal to the bitwise XOR of a and b  a = a ^ b 
<<=  bitwise left shift assignment  a <<= b  a becomes equal to a left shifted by b  a = a << b 
>>=  bitwise right shift assignment  a >>= b  a becomes equal to a right shifted by b  a = a >> b 
The simple assignment operator expressions have the form.
lhs = rhs 
where.
lhs    modifiable lvalue expression of any complete object type 
rhs    expression of any type implicitly convertible to lhs or compatible with lhs 
Assignment performs implicit conversion from the value of rhs to the type of rhs and then replaces the value in the object designated by lhs with the converted value of rhs.
Assignment also returns the same value as what was stored in lhs
(so that expressions such as a = b = c
are possible). The value category of the assignment operator is nonlvalue (so that expressions such as (a=b)=c
are invalid).
rhs and lhs must satisfy one of the following:
NULL
_Bool
(possibly qualified or atomic) and rhs is a pointer If rhs and lhs overlap in memory (e.g. they are members of the same union), the behavior is undefined unless the overlap is exact and the types are compatible.
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 updating lhs is sequenced after the value computations, but not the side effects of lhs and rhs themselves and the evaluations of the operands are, as usual, unsequenced relative to each other (so the expressions such as i=++i
; are undefined).
Assignment strips extra range and precision from floatingpoint expressions (see FLT_EVAL_METHOD
).
In C++, assignment operators are lvalue expressions, not so in C.
#include <stdio.h> int main(void) { const char **cpp; char *p; const char c = 'A'; // cpp = &p; // Error: char** is not convertible to const char** *cpp = &c; // OK, char* is convertible to const char* *p = 0; // OK, null pointer constant is convertible to any pointer int arr1[2] = {1,2}, arr2[2] = {3, 4}; // arr1 = arr2; // Error: cannot assign to an array struct s { int arr[2]; // an array wrapped in a struct } 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:
7 8
The compound assignment operator expressions have the form.
lhs op rhs 
where.
op    one of *= , /= %= , += = , <<= , >>= , &= , ^= , = 
lhs, rhs    expressions with arithmetic types (where lhs may be qualified or atomic), except when op is += or = , which also accept pointer types with the same restrictions as + and  
The expression lhs @= rhs is exactly the same as lhs =
lhs @ (
rhs )
, except that lhs is evaluated only once.
If lhs has atomic type, the operation behaves as a single atomic readmodifywrite operation with memory order For integer atomic types, the compound assignment 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) 
Common operators  

assignment  increment decrement  arithmetic  logical  comparison  member access  other 







© cppreference.com
Licensed under the Creative Commons AttributionShareAlike Unported License v3.0.
http://en.cppreference.com/w/c/language/operator_assignment