关于自增运算符的问题

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 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
查优先表啊
  • 打赏
  • 举报
回复
a++=10; //不能通过编译
优先级问题

64,641

社区成员

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

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