赋值运算符

赋值表达式 将值存储在由左操作数指定的对象中。 有两种类型的赋值运算符:所有赋值表达式中的左操作数必须是可修改的 lvalue。 表达式的类型是左操作数的类型。 表达式的值是赋值完成后左操作数的值。

仅限 C 赋值表达式的结果不是左值。 仅限 C

仅限 C + + 赋值表达式的结果是一个左值。 仅限 C + +

所有赋值运算符具有相同的优先顺序,并且具有从右到左的关联性。

简单赋值运算符 =

简单赋值运算符具有以下格式:

lvalue = 表达式

运算符将右操作数 expr 的值存储在由左操作数 lvalue指定的对象中。

如果左操作数不是类类型 ,也不是 IBM 扩展向量类型IBM 扩展 ,则右操作数将隐式转换为左操作数的类型。 此转换类型不是由 constvolatile限定的。

如果左操作数是类类型,那么该类型必须完整。 调用左操作数的复制赋值运算符。

如果左操作数是引用类型的对象,那么编译器会将右操作数的值分配给引用所表示的对象。

复合赋值运算符

复合赋值运算符由二进制运算符和简单赋值运算符组成。 它们对两个操作数执行二进制运算符的操作,并将该操作的结果存储到左操作数中,该操作数必须是可修改的 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

尽管等效表达式列显示了两次左操作数 (来自示例列) ,但它实际上仅求值一次。

仅限 C + + 除了操作数类型表之外,如果表达式不是类类型,则隐式转换为左操作数的无 cv 限定类型。 但是,如果左侧操作数是类类型,那么类将完成,并且对类对象的赋值将作为复制赋值操作执行。 复合表达式和条件表达式是 C++ 中的 lvalues ,这允许它们成为复合赋值表达式中的左操作数。

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