关于自增运算符++

highlight 2000-09-08 11:41:00
加精
在谭浩强的书中有个地方提到 (++i)+(++i)+(++i) 的问题.
在VC6中测试,结果令人不解,特此求教.

#include "stdio.h"
void main(void)
{
int i, a;
i = 3;
a = (++i)+(++i)+(++i);
printf("\n%d\t%d\n", a, i); /* i为6,a为16?为什么a不是15? */
}

程序改成如下后,a为15.这又是为什么?

#include "stdio.h"
void main(void)
{
int i, a, l, m, n;
i = 3;
a = (l = ++i)+(m = ++i)+(n = ++i);
printf("\n%d\t%d\t%d\t%d\t%d\n", a, i, l, m, n);
/* a为15,i为6, l,m,n依次为4,5,6 */
}
...全文
501 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveworm88 2001-06-07
  • 打赏
  • 举报
回复
补充一下,用C/C++编写的linux拨号上网的程序?(急!!)
loveworm88 2001-06-07
  • 打赏
  • 举报
回复
有谁能提供linux下拨号上网的程序?
loveworm88 2001-06-07
  • 打赏
  • 举报
回复
whhif 2001-05-20
  • 打赏
  • 举报
回复
to softsprite(软件精灵):
你是怎么样知道编译器是这样算的,
我只知道在pc中因为只有有限个寄存器;
编译器有可能是以你的编码编译的,
但在work station如sun station中,
(a++)+(a++)+(a++)的问题就能顺利
解决,你能想出在 station中编译器是如
何编译的吗?请多指教。
whhif 2001-05-20
  • 打赏
  • 举报
回复
++运算符,打个比方,例如++a和a++;
a++其实是表达式:a=(a=a)+1;
++a是表达式:a=(a=a+1);
这两个表达式在独立用的时候效果相同,
但和别的表达式一起用的时候,这就会
关系到C的一个规定,就是C程序中的表达式
只能一次赋一个值。
例如:a+(b++);
b只被赋(b=b);
而没有在a+(b++)中赋第二个值,
也就是b=(b=b)+1;
a+(b++)的值是a+b;
而不是a+b+1;
但b在表达式外的值是b+1;
b被赋了两次值,只是一次在表达式中,
一次在表达式外。
++a运算符的道理也是如此。
#include <stdio.h>
int main()
{
int a(1),b(1);
int c;
c=a+(b++);
cout<<c<<endl;
cout<<b;
return 0;
}
打出的结果应是:2
2
而不是:3
2
这回你应当懂怎么用了吧;
至于(++a)+(++a)+(++a)的问题实在是无聊之至,不用再去多费脑筋了,
这种问题只有在等级考试中才有,
另外,
一个程序的好坏,第一点就取决于程序的可读性,
好的程序是不可能出现这种情况的;


ahpei55 2001-05-16
  • 打赏
  • 举报
回复
行家一出手便知该不该看!
early 2000-09-11
  • 打赏
  • 举报
回复
拜读
jiujiejushi 2000-09-11
  • 打赏
  • 举报
回复
softsprite,你真了不起!
U皮特U 2000-09-09
  • 打赏
  • 举报
回复
确实是编译器的问题,以下是(++i)+(++i)+(++i)的汇编码:
// i 的值存放在[ebp-4]中,a的值存放在[ebp-8]中
// 1 - 3 实现++i的操作,此时i=4
1 mov eax,dword ptr [ebp-4]
2 add eax,1
3 mov dword ptr [ebp-4],eax
// 4 - 6 实现上步得到的i(4)再加一的操作,此时i=5
4 mov ecx,dword ptr [ebp-4]
5 add ecx,1
6 mov dword ptr [ebp-4],ecx
// 错误在此处,本意是将第一步的++i与第二步的++i相加,存放在edx中
// 但第二步的值已经覆盖了第一步的值,因此得出的值为10,而正确值是9
// 此时edx=10
7 mov edx,dword ptr [ebp-4]
8 add edx,dword ptr [ebp-4]
// 实现第三步++i操作,此时i=6
9 mov eax,dword ptr [ebp-4]
a add eax,1
b mov dword ptr [ebp-4],eax
// 将第三步++i的值([ebp-4]与前两步之和(edx)相加,结果为16
c add edx,dword ptr [ebp-4]
d mov dword ptr [ebp-8],edx

避免错误的办法是在同一行中不要多次使用++操作,而应该分别放在不同的临时变量中后再相加。因此你后面的代码正确。
ad 2000-09-09
  • 打赏
  • 举报
回复
你别再纠缠这个问题了,这可能是编译器的一个错误。实际编程中建议不要这样写程序,因为这样使程序的可读性变差,也就是说,c的所有特性仅仅是特性而已,未必是优点,不必去咬文嚼字,需要注重的是编程风格。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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