现代C:概念剖析和编程实践
上QQ阅读APP看书,第一时间看更新

4.2 修改对象的运算符

我们已经看到的另一个重要的操作是赋值:a = 42。从这个例子中可以看出,这个操作符不是对称的:它右边有一个值,左边有一个对象。反常的语言滥用中,C jargon通常将右侧称为rvalueC(右值),将左侧的对象称为lvalueC(左值)。只要有可能,我们就尽量避免使用这种词汇:谈论一个值和一个对象就足够了。

C还有其他的赋值运算符。对于任何二进制操作符@,我们看到的5个都有语法

049-01

它们只是把算术运算符@和赋值结合起来的方便缩写,见表4.2。一个大致相当的形式是

049-02

换句话说,有+=-=*=/=%=运算符。例如,在for循环中,可以使用运算符+=

049-03

这些运算符的语法有些挑剔。在不同字符之间不允许有空格:例如,用i + = 7代替i += 7是语法错误。

要点4.10 运算符必须将所有字符直接连接在一起。

我们已经看到了另外两个修改对象的运算符:递增运算符C++递减运算符C--

  • ++i等于i += 1
  • --i等于i -= 1

所有这些赋值运算符都是实数运算符。它们返回一个值(而不是一个对象!):修改后对象的值。如果你够疯狂的话,可以写成这样

050-01

但是这种一次对多个对象进行修改的组合通常是不受欢迎的。不要这样做,除非你想让你的代码混乱。对表达式中涉及的对象所做的此类修改称为副作用C

要点4.11 值表达式中的副作用是有害的。

要点4.12 不要在一个语句中修改多个对象。

对于递增和递减运算符,甚至还有两种其他形式:后缀递增C后缀递减C。它们与我们所见过的不同之处在于,它们为所围绕的表达提供了结果。这些运算符的前缀版本(++a--a)先执行操作,然后返回结果,与相应的赋值运算符(a+=1a-=1)非常相似。后缀操作在操作之前返回值,然后对之后的对象进行修改。对于其中任何一种形式,对变量的影响都是相同的:递增或递减的值。

所有这些都表明,对有副作用的表达式进行计算可能比较困难。不要这样做。