©
本文档使用 PHP中文网手册 发布
赋值和复合赋值运算符是二元运算符,它们使用右侧的值将变量修改为左侧。
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 和 rhs 都有算术类型,在这种情况下lhs可能是挥发性限定的或原子的
lhs和rhs都有指向兼容(忽略限定符)类型的指针,或者其中一个指针是指向void的指针,并且转换不会为指向类型添加限定符。lhs可能是挥发性的或限制性的或原子的。
lhs是一个指针(可能是限定的或原子的),rhs是一个空指针常量,如 NULL
lhs有类型_Bool
(可能是合格的或原子的),rhs是一个指针
如果 rhs 和 lhs 在内存中重叠(例如它们是同一联合的成员),则行为不确定,除非重叠是准确的并且类型是兼容的。
虽然数组不可分配,但是包装在结构中的数组可以分配给具有相同(或兼容)结构类型的另一个对象。
更新 lhs 的副作用在值计算之后进行排序,但不是 lhs和 rhs 本身的副作用以及操作数的评估像往常一样相对于彼此不相关(所以诸如i=++i
; 的表达式是未定义的)。
赋值从浮点表达式中剥离了额外的范围和精度(请参阅参考资料FLT_EVAL_METHOD
)。
在 C ++中,赋值运算符是左值表达式,而不是 C.
// todo more, demo struct{array} tooconst 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):
6.5.16作业操作员(p:101-104)
C99标准(ISO / IEC 9899:1999):
6.5.16作业操作员(p:91-93)
C89 / C90标准(ISO / IEC 9899:1990):
3.3.16赋值运算符