请教高手p = &(i++);为什么会错。

ldshow 2005-03-22 02:25:48

void main()
{
int i = 2;
int *p;
//p = &(i++);//错
p = &++i;//对
//p = (&i)++;//错
}
请高手帮助解答
...全文
801 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
wish1205 2005-03-24
  • 打赏
  • 举报
回复
学习中~~~~~~~~~~~
wmlin 2005-03-24
  • 打赏
  • 举报
回复
p = &(i++);
可以理解成先把i的值赋给一个临时变量,然后i = i + 1,然后返回临时变量。根本不是p = &i。
dbaren 2005-03-24
  • 打赏
  • 举报
回复
我有一点不明白:
p = &(i++);
应该是先: p = &i //这时i还不是什么特殊的东西把
再:i++
怎么会不对呢
望各位大侠指点
UnrealImagecoffee 2005-03-24
  • 打赏
  • 举报
回复
//p = (&i)++;//错

在这里(&i)的结果是一歌指针,(在内存里,指针是常量).
常量 不能 做左值
dbaren 2005-03-24
  • 打赏
  • 举报
回复
ok,我明白了,谢谢紫风兄!

p = &(i++)
其实是先:p = &一个匿名变量(值等于i的值) //这里就出错了
再:i=i+1
GODNAME 2005-03-23
  • 打赏
  • 举报
回复
error C2102: '&' requires l-value
error C2105: '++' needs l-value
//p = &(i++);//错在p是先指向的i的地址,而执行完该句后i自加,那末i在内存地址也改变
p = &++i;//对 先自加,而后p指向i地址;
//p = (&i)++;//错 指针p没有指向i的地址
请各位高手对我的观点进行指教


healer_kx 2005-03-23
  • 打赏
  • 举报
回复
因为它们的汇编大抵是这样的。
LEA EAX,i
。。。 。。。用,
INC EAX


&(i++)

i会生成一个临时变量 临时变量是const的, 不是左值!!!!!!!!!!!!!!!!
allen_zhaozhencn 2005-03-23
  • 打赏
  • 举报
回复
//p = &(i++);//i++将生成一个临时变量,对该临时对象进行&操作,临时对象的生成的周期在完整的语句后结束,所以,这样肯定出错。
p = &++i;//对, ++i是左值, 然后进行&操作,当然正确。
//p = (&i)++;//&i是常量,进行++操作当然出错。
}
junmayang 2005-03-23
  • 打赏
  • 举报
回复
讨论没啥用,编译不过才是硬道理!
wmlin 2005-03-23
  • 打赏
  • 举报
回复
i++和++i有除了那个众所周知的区别外还有一个区别i++返回的是一个等于i的匿名(临时)变量然后自身加1,而i++是将自身加1后直接返回本身(i)。所以&(i++)对(临时)变量取址是错误的。而&(++i)对i取址是正确的。
shine51151 2005-03-23
  • 打赏
  • 举报
回复
我认为下面这个解释最好,既能说明问题又容易理解

//p = &(i++);//错
//p = (&i)++;//错

括号中的表达式产生一个运算结果,保存在一个临时变量中。取地址&操作会作用到这个临时变量上,产生一个没有意义的结果,导致程序不正确。所以编译时这种操作会被认为是错误的。

楼主要这么写就不会出错了 //( p = (&i) ) ++; //
kuny1130 2005-03-23
  • 打赏
  • 举报
回复
学习````
xnlcx 2005-03-23
  • 打赏
  • 举报
回复
学习中
yuchengliu 2005-03-23
  • 打赏
  • 举报
回复
顶!
i++是一个表达式
mfs 2005-03-23
  • 打赏
  • 举报
回复
学习中永于创新,即使发现错误也是好事,我们提倡这样的做法,这样才能有进步.

friend_mhj 2005-03-23
  • 打赏
  • 举报
回复
这样的代码还是少用为妙。
维护的成本太高了!
langzi8818 2005-03-23
  • 打赏
  • 举报
回复
3,4楼讲的很清楚了我想
xsp919 2005-03-23
  • 打赏
  • 举报
回复
学习~~
snakebite2008 2005-03-23
  • 打赏
  • 举报
回复
1、 p=&(i++)中,*和&是同一优先级,后缀的++和--的优先级高于*和&,而括号的优先级最高。所以,是先运算括号,再运算其中的后缀++,即i先参加&运算,再自增1,最后进行=运算。这个情况和第3种情况类似,p指向了未知的存储单元。

2、p=&++i中,前缀++和--的优先级与*和&相同,但是&运算顺序是由右向左,所以先计算++i,即i先自增1,然后再参加&运算。

3、p=(&i)++中,括号优先级最高,所以先计算括号中的&运算,然后因为后缀++的优先级高于=,所以计算++,最后进行=运算。此时,p指向的是紧挨着i的下一个存储单元。~鬼才知道是什么。

大家觉得呢?
TangJianQiang 2005-03-22
  • 打赏
  • 举报
回复
你愿意的话,请你分开两句来写
i++;
p=&i;
这样程序更容易让人看懂
加载更多回复(15)

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧