赋值运算符
赋值表达式的结果不是左值。 
赋值表达式的结果是一个左值。 
所有赋值运算符具有相同的优先顺序,并且具有从右到左的关联性。
简单赋值运算符 =
简单赋值运算符具有以下格式:
lvalue = 表达式
运算符将右操作数 expr 的值存储在由左操作数 lvalue指定的对象中。
如果左操作数不是类类型 ,也不是
向量类型
,则右操作数将隐式转换为左操作数的类型。 此转换类型不是由 const 或 volatile限定的。
如果左操作数是类类型,那么该类型必须完整。 调用左操作数的复制赋值运算符。
如果左操作数是引用类型的对象,那么编译器会将右操作数的值分配给引用所表示的对象。
复合赋值运算符
复合赋值运算符由二进制运算符和简单赋值运算符组成。 它们对两个操作数执行二进制运算符的操作,并将该操作的结果存储到左操作数中,该操作数必须是可修改的 lvalue。
下表显示了复合赋值表达式的操作数类型:
| 运算符 | 左操作数 | 右操作数 |
|---|---|---|
| + = 或-= | 算术 | 算术 |
| + = 或-= | 指针 | 整型 |
| * = ,/= 和 %= | 算术 | 算术 |
| <<=, >>=, &=, ‸=, and |= | 整型 | 整型 |
请注意,表达式
a *= b + c相当于a = a * (b + c)而不是a = a * b + c下表列出了复合赋值运算符,并显示了使用每个运算符的表达式:
| 运算符 | 示例 | 等效表达式 |
|---|---|---|
| += | index += 2 |
index = index + 2 |
| -= | *pointer -= 1 |
*pointer = *pointer - 1 |
| *= | bonus *= increase |
bonus = bonus * increase |
| /= | time /= hours |
time = time / hours |
| %= | allowance %= 1000 |
allowance = allowance % 1000 |
| <<= | result <<= num |
result = result << num |
| >>= | form >>= 1 |
form = form >> 1 |
| &= | mask &= 2 |
mask = mask & 2 |
| ‸= | test ‸= pre_test |
test = test ‸ pre_test |
| |= | flag |= ON |
flag = flag | ON |
尽管等效表达式列显示了两次左操作数 (来自示例列) ,但它实际上仅求值一次。
除了操作数类型表之外,如果表达式不是类类型,则隐式转换为左操作数的无 cv 限定类型。 但是,如果左侧操作数是类类型,那么类将完成,并且对类对象的赋值将作为复制赋值操作执行。 复合表达式和条件表达式是 C++ 中的 lvalues ,这允许它们成为复合赋值表达式中的左操作数。

当GNU C语言功能启用后,复合表达式和条件表达式可以作为左值,前提是其操作数是左值。 详情请参阅左值和右值
