15.2 其他运算符
15.2.1 复合赋值运算符
复合赋值运算符(Compound Assignment Operator)包括*= /= %= += -= <<= >>= &= ^= |=,一边做运算一边赋值。例如a += 1相当于a = a + 1。但有一点细微的差别,前者对表达式a只求值一次,而后者求值两次,如果a是一个复杂的表达式,求值一次和求值两次的效率是不同的,如a[i+j] += 1和a[i+j] = a[i+j] + 1。仅仅是效率上的差别吗?对于没有Side Effect的表达式,求值一次和求值两次的结果是一样的,但对于有Side Effect的表达式则不一定,例如a[foo()] += 1和a[foo()] = a[foo()] + 1,如果foo()函数调用有Side Effect,比如会打印一条消息,那么前者只打印一次,而后者打印两次。
在第6.3节中讲自增、自减运算符时说++i相当于i = i + 1,其实更准确地说应该等价于i += 1,表达式i只求值一次,而--i等价于i -= 1。