永发信息网

C程序问题(关于自增运算符)

答案:5  悬赏:50  手机版
解决时间 2021-04-27 02:03
  • 提问者网友:泪痣哥哥
  • 2021-04-26 05:38

#include<stdio.h>
void main()
{
int i=3,j;
j=(++i)+(++i)+(++i);
printf("%d\n",j);
}

为什么j为16啊?讲一下求解过程。

最佳答案
  • 五星知识达人网友:动情书生
  • 2021-04-26 07:16

我在自己机器上实验过了,运行结果的确是16.


我试着解释一下,不知道是不是这样,供楼主【参考】。


首先,(++i)+(++i ),第一次++i,值为4(第一个加数增加1);第二次++i,值为5(第二个加数自加1);此时注意了,第二个加数的自加同时影响第一个加数,因为都是i,储存在同一个单元,所以(++i)+(++i )的结果是5+5,为10;此时10储存在内存单元,不自加,而++i再次自加,为6。所以,最后结果为10+6=16.



【PS】:谢谢四楼的同志“77086959”7对我的想法的验证。

全部回答
  • 1楼网友:鱼芗
  • 2021-04-26 09:43

第一个++i执行完后并没有马上使用,等到两个++i相加的时候才使用它的值,这时候两个i都是5

  • 2楼网友:渡鹤影
  • 2021-04-26 09:04

正解 按照他的思路 下面的程序应该输出13

#include<iostream> using namespace std; int main() { int i=3,j=0; j=(++i)+(i++)+(++i); printf("%d\n",i); printf("%d\n",j); return 1; }

  • 3楼网友:洒脱疯子
  • 2021-04-26 08:37
应该是15的啊。 怎么会是16呢?会不会是跟你的编译器有关啊?
  • 4楼网友:渡鹤影
  • 2021-04-26 08:28

不同编译器对++或者--的处理不同~

以VC6.0

编译器做如下处理得到16

mov eax,dword ptr [ebp-4] add eax,1 mov dword ptr [ebp-4],eax mov ecx,dword ptr [ebp-4] add ecx,1 两次自加得到5

mov dword ptr [ebp-4],ecx mov edx,dword ptr [ebp-4] add edx,dword ptr [ebp-4] 自生相加EDX得到10但是i为5 mov eax,dword ptr [ebp-4] 将i的值传到EAX add eax,1 EAX+1得到6 mov dword ptr [ebp-4],eax i现在是6 add edx,dword ptr [ebp-4] 与EDX中的10相加 mov dword ptr [ebp-8],edx 最终得到16

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯