社区
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++里写重载++操作符的作法,应该是两种方法都能通过编译才是.
没想到实验结果是上面那样.
为什么会出现这种情况呢?
...全文
372
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++程序,注释详细,简单明了,方便学习交流
使用
自增
运算符
打印包含前 10 个三角数的表
使用
自增
运算符
打印包含前 10 个三角数的表,具体博文请参考苹果开发者Mike的博文http://blog.sina.com.cn/s/blog_7aa21f320100qyes.html
解析C语言中
自增
自减
运算符
.pdf
解析C语言中
自增
自减
运算符
.pdf
深入分析C语言
自增
表达式.pdf
深入分析C语言
自增
表达式.pdf
31.java
自增
自减
运算符
.zip
31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
.zip31.java
自增
自减
运算符
C++ 语言
65,208
社区成员
250,517
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章