社区
C++ 语言
帖子详情
关于自增运算符的问题
xlbdan
2007-06-07 09:43:05
在<<pointers on C>>里说,这种:
int a=0;
++a=10; //应该是不能通过编译的,因为++a返回的是一个右值,对右值无法赋值
我做了一下试验,结果发现与书不一致:
++a=10; //能正常运算,当然结果是10
a++=10; //不能通过编译
而我原以为++a=10的确不应该通过,而a++应该通过才对.
另外根据C++里写重载++操作符的作法,应该是两种方法都能通过编译才是.
没想到实验结果是上面那样.
为什么会出现这种情况呢?
...全文
354
18
打赏
收藏
关于自增运算符的问题
在<>里说,这种: int a=0; ++a=10; //应该是不能通过编译的,因为++a返回的是一个右值,对右值无法赋值 我做了一下试验,结果发现与书不一致: ++a=10; //能正常运算,当然结果是10 a++=10; //不能通过编译 而我原以为++a=10的确不应该通过,而a++应该通过才对. 另外根据C++里写重载++操作符的作法,应该是两种方法都能通过编译才是. 没想到实验结果是上面那样. 为什么会出现这种情况呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Vitin
2007-06-11
打赏
举报
回复
C++是这么规定的:a++=10; 如果a是内建数据类型比如int,不能通过编译;如果a是自定义数据类型,则可以编译通过。
因为在C++里,内建数据类型是2等公民,用户自定义数据类型是头等公民。
自定义数据类型的临时变量,可以被修改。
===================================================================
也许a++的operator++(int)应该返回const T。这样就能和内建数据类型一样了。
我的感觉是,用户自定义数据类型要尽量和内建数据类型行为一致。
Vitin
2007-06-11
打赏
举报
回复
++a=10的原因,可以从deng2000()的回复中得到。
=比++优先级低的。
VCLIFE
2007-06-11
打赏
举报
回复
你说的很有道理,这点我也想到了,之所以还不能理解就是因为<<C与指针>>这本书上写的是++a=10不能通过,但我试验却能通过,你的解释也是能通过,所以我就不大敢相信像这样著名的书籍会出错误吗?
--------------------------
一切以实践为真理。也许书上没错,不知道哪个王八蛋排版时弄错了。。。。。
VCLIFE
2007-06-11
打赏
举报
回复
迷惑啊,=不是比++优先级高吗?为什么结果不是11啊??????????????
我指++a=10;
taodm
2007-06-11
打赏
举报
回复
C++是这么规定的:a++=10; 如果a是内建数据类型比如int,不能通过编译;如果a是自定义数据类型,则可以编译通过。
因为在C++里,内建数据类型是2等公民,用户自定义数据类型是头等公民。
自定义数据类型的临时变量,可以被修改。
xlbdan
2007-06-11
打赏
举报
回复
哪位高手有不同意见
xlbdan
2007-06-10
打赏
举报
回复
ding
taodm
2007-06-08
打赏
举报
回复
C与指针是讲指针的比较好的书籍。它在其它问题上的描述,你就别看了。这不是它的强项,出错也很正常。
而且,C与指针是很老的一本书了,在目前编译器下,已经有很多知识是过时的了。看的时候主要是掌握原则。细节必须自己多实践,并且自己去更新它。
xlbdan
2007-06-08
打赏
举报
回复
有兴趣的朋友可以看<<C和指针>>的73页
也谢谢ayw215(松花鼠) ,不过 我的问题依然存在,如上一条回复
xlbdan
2007-06-08
打赏
举报
回复
to deng2000()
你说的很有道理,这点我也想到了,之所以还不能理解就是因为<<C与指针>>这本书上写的是++a=10不能通过,但我试验却能通过,你的解释也是能通过,所以我就不大敢相信像这样著名的书籍会出错误吗?
xlbdan
2007-06-08
打赏
举报
回复
嗯,它的指针讲的还不错,比较深入
至于我的这个问题,我一直担心是我哪里没理解清楚
pinejeely
2007-06-07
打赏
举报
回复
a++ = 10;
++在变量后面时候优先级是最低的
ayw215
2007-06-07
打赏
举报
回复
a++=10; //不能通过编译
优先级问题
_________________________
这个似乎不是优先级的问题
编译的错误位: non-lvalue in assignment
假设可以通过,把10给了a,然后对10自加,这是不允许的(不知道这样理解算不算对)
对于++a=10;
反汇编出来是:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
call __alloca
call ___main
movl $0, -4(%ebp)
leal -4(%ebp), %eax
incl (%eax)-------a自加
movl $10, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, 4(%esp)-----10给了a
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
--------------
原程序是:
#include <stdio.h>
int main()
{
int a=0;
++a=10;
printf("%d",a);
}
---------
编译器把a自加后的值给了eax,然后又把10给了eax。
所以这个是可以的
deng2000
2007-06-07
打赏
举报
回复
如果把a++和++a想象成为函数的话,它们的实现是这样的:
// C++伪代码
int a++()
{
int n = a;
a += 1;
return n;
}
int& ++a()
{
a += 1;
return a;
}
a++返回的是一个临时变量,因此它不能成为一个左值(l-value)
++a返回的是a本身,可以作为左值出现在等号左边.
xlbdan
2007-06-07
打赏
举报
回复
可能我的问题不是很清楚,总结一下就是:
为什么
++a=10; 能正常运算
为什么
a++=10; 不能通过编译
xlbdan
2007-06-07
打赏
举报
回复
不是吧,a++=10的错误是:
error C2106: '=' : left operand must be l-value
说明它已经判断出来了运算顺序,而错在a++是右值
zjq520
2007-06-07
打赏
举报
回复
查优先表啊
珍惜生命远离CPP
2007-06-07
打赏
举报
回复
a++=10; //不能通过编译
优先级问题
解析C语言中
自增
运算符
问题
.pdf
解析C语言中
自增
运算符
问题
.pdf
自增
运算符
重载
自增
运算符
重载C++程序,注释详细,简单明了,方便学习交流
NOIP信息学奥赛通关必备-C++语法专题-
自增
自减
运算符
3、本课程为系列课中的
自增
自减
运算符
知识讲解; 4、本课程是基于小学生的认知发展水平开发的,运用孩子生活中常见的例子来阐述编程知识,让孩子听得懂学得会; 5、学完本课程后,孩子可以自主编程,解决竞赛中,...
使用
自增
运算符
打印包含前 10 个三角数的表
使用
自增
运算符
打印包含前 10 个三角数的表,具体博文请参考苹果开发者Mike的博文http://blog.sina.com.cn/s/blog_7aa21f320100qyes.html
java代码-
自增
运算符
和自减
运算符
java代码-
自增
运算符
和自减
运算符
C++ 语言
64,641
社区成员
250,579
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章