社区
C++ 语言
帖子详情
请教高手p = &(i++);为什么会错。
ldshow
2005-03-22 02:25:48
void main()
{
int i = 2;
int *p;
//p = &(i++);//错
p = &++i;//对
//p = (&i)++;//错
}
请高手帮助解答
...全文
801
35
打赏
收藏
请教高手p = &(i++);为什么会错。
void main() { int i = 2; int *p; //p = &(i++);//错 p = &++i;//对 //p = (&i)++;//错 } 请高手帮助解答
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
请教
高手
:javascript中var i = {};是什么意思
请教
高手
:javascript中var i = {};是什么意思 Javascript 专业回答 helen5106 2009-08-10 18:06 2楼的有点急了,呵呵 var i = {}; 跟 var i = new Object(); 是一个意思,JavaScript 有3中方式定义对象,还有一种: function P (x
c语言填空题若xyz满足方程,
高手
请进,
请教
一道简单的c语言题!
该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#include#include#include#includeusingnamespacestd;ifstreamfin("alpha.in");ofstreamfout("alpha.out");#definecinfin#definecoutfoutintnn;/////////////...
请教
LUA
高手
一段代码,希望帮忙谢谢!
以下是一段LUA的代码,
请教
高手
“perm{"a", "b", "c"}”为什么能返回一个tablefunction permgen (a, n) if n == 0 then coroutine.yield(a) else for i=1,n do -- put i-th element as the last one a[n], a[i] = a[i], a[n] --...
C/C
++
笔试题5
C
++
笔试题4. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。2) 不存在指向空值的引用,但是存在指向空值的指针。8. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区
关于《C
++
程序设计教程》(第二版)钱能著 第二章课后习题第5题的解答程序
请教
高手
!下面的程序:#include #include using namespace std;int main(){ for(int i=100;i { int a=0 ; for(int j=2;j { if(i%j==0) a=a+j; } if(a==0&&i/100==i%10 cout } sys
C++ 语言
64,681
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章