Assignment operators
赋值运算符
赋值和复合赋值运算符是二元运算符,它们使用右侧的值将变量修改为左侧。
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 |
简单的任务
简单赋值运算符表达式具有这种形式。
lhs = rhs | | |
---|
其中
lhs | - | modifiable lvalue expression of any complete object type |
---|---|---|
rhs | - | expression of any type implicitly convertible to lhs or compatible with lhs |
赋值执行从 rhs 值到 rhs 类型的隐式转换,然后用转换后的 rhs 值替换由 lhs 指定的对象中的值。
赋值也返回与存储的值相同的值lhs
(以便可能的表达式a = b = c
)。赋值运算符的值类别是非左值(因此表达式(a=b)=c
无效)。
rhs 和 lhs 必须满足以下条件之一:
- lhs 和 rhs 都具有兼容的结构或联合类型,或..
注意
如果 rhs 和 lhs 在内存中重叠(例如它们是同一联合的成员),则行为不确定,除非重叠是准确的并且类型是兼容的。
虽然数组不可分配,但是包装在结构中的数组可以分配给具有相同(或兼容)结构类型的另一个对象。
更新 lhs 的副作用在值计算之后进行排序,但不是 lhs和 rhs 本身的副作用以及操作数的评估像往常一样相对于彼此不相关(所以诸如i=++i
; 的表达式是未定义的)。
赋值从浮点表达式中剥离了额外的范围和精度(请参阅参考资料FLT_EVAL_METHOD
)。
在 C ++中,赋值运算符是左值表达式,而不是 C.
// todo more, demo struct{array} too
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
复合分配
复合赋值运算符表达式具有这种形式。
lhs op rhs | | |
---|
其中
操作 | - | * =,/ =%=,+ = - =,<< =,>> =,&=,^ =,| =中的一个 |
---|---|---|
lhs,rhs | - | 具有算术类型的表达式(其中lhs可以是限定的或原子的),除了当op是+ =或 - =时,它们也接受与+和 - 相同限制的指针类型, |
表达式 lhs @ =
rhs 与 lhs =
lhs @ (
rhs 完全相同)
,只是 lhs 只被计算一次。
如果 lhs 具有原子类型,则该操作表现为具有内存顺序 memory_order_seq_cst的单个原子读取 - 修改 - 写入操作。对于整数原子类型,复合赋值@ =相当于:T1 * addr =&lhs; T2 val = rhs; T1 old = * addr; T1新; {new = old @ val} while(!atomic_compare_exchange_strong(addr,&old,new); | (自C11以来) |
---|
参考
- C11标准(ISO / IEC 9899:2011):