关于i++i,曾在一本书上看过,后置++是一个类似原子操作的不可拆分的过程,系统将后置++看作一个常量来处理。由于当时忘记记录,今日又遇到了类似的问题,于是做一个简单的分析。
关于i+++i:
#include<stdio.h>
int main()
{
int i = 1;
int a = i+++i;
printf("%d",a);
return 0;
}
上面代码的打印结果是2。说明,当i++与++i同时存在时,默认先编译i++,可以初步理解为后置++优先级高于前置++
#include<stdio.h>
int main()
{
int i = 1;
(i++) += i;
return 0;
}
(i++)+ = i;这里会报错,提示(i++)是一个不可修改的左值。那么错误到底出现在哪里呢?
将i++整体看作x,按照我们的理解,这一句将会变成x = x+i,再将x展开,变成了i++ = i+++i。
按照后置++的理解,先将赋值右边的值赋给i,再执行i自加。
有了前一个程序,说明赋值右边的i+++i是可以编译通过的,而且值为2。
那么说明i++ = 2;编译不通过。
经过尝试,编译器同样在i++ = 2;这句报错,同样提示i是一个不可修改的左值。
这一句的执行顺序是先给i赋值再自加,相当于将i++拆开。但由于i++是一个类似原子操作的不可分的整体,所以编译器会报错。