结论
1. i++ 是两步操作,第一步:a = i 第二步:i = i+1,最终返回a,但a是不具名的,也无法取地址
2. ++i 也是两步操作,第一步:i = i+1 第二步:return i,最终返回也就是i本身,所以可以取地址
3. 基于结论1、结论2,现在你知道为什么i++++会编译报错,而++++i能执行成功了吧,道理很简单,i++返回的是i的旧值,不具名,也无法取地址,只能作为右值。i++++是对一个没有地址的变量进行++操作,完全没法执行嘛
4. 只要知道i++返回是i的旧值,++i返回是i的新值就行了。谁要是问你为什么 ++i++ 会编译报错,而 (++i)++ 能执行成功的话,你就扇他吧
实验1(测试i++的结果是否是具名的,能否取地址)
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int i = 1;
cout<<"i.p="<<&i<<endl;
cout<<"i++.p="<<&(i++)<<endl;
}
结果如下,直接编译错误,提示需要左值,如下图
也就是说 "i++" 不是左值,也验证了我们第一条结论,i++的结果是不具名的,也无法取地址
实验2(证明i++的结果不是左值,也无法赋值)
int main()
{
int i = 1;
i++ = 10;
}
编译时报错如下,明确提示赋值操作的左侧需要左值
实验3(测试++i的结果是否是具名的,能否取地址)
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int i = 1;
cout<<"i.p="<<&i<<endl;
cout<<"++i.p="<<&(++i)<<endl;
}
结果如下,成功打印出了++i的地址,且和i的地址一样,也就验证了第二条结论,++i返回是i本身,是可以取地址的