首先给出下面的代码:
int main() {
int a = 1;
int b = 1;
a += b += 1;
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
运行结果如图:

通过运行结果可以很容易推断出:
a += b += 1 <=> a += (b += 1)
现在解决一开始的问题,a += 1 += 1 为什么是错的?
很明显,由上述的推断可知上面的表达式等价于
a += (1 += 1)
这个表达式会先运算 1 += 1 ,
而 1 += 1 等价于 1 = 1 + 1,
等价后的表达式意味着把 1 + 1 的结果赋值给左操作数1 ,
左操作数1是个常量,常量是无法被赋值的,
自然而然的这个表达式就是错的。
总结一下,上面表达式错误的根本原因是给常量赋值,因为像 += 、-= 、*=、 /=、 %= 之类的操作符是具有赋值功能的。