一个++i的小题目希望得到语法解释

来源:百度知道 编辑:UC知道 时间:2024/06/16 19:06:52
int j, i=1;

j=++i+(++i);

printf("%d\n",j);

输出结果是6
反汇编相关代码如下
0040102F mov eax,dword ptr [ebp-8]
00401032 add eax,1
00401035 mov dword ptr [ebp-8],eax
00401038 mov ecx,dword ptr [ebp-8]
0040103B add ecx,1
0040103E mov dword ptr [ebp-8],ecx
00401041 mov edx,dword ptr [ebp-8]
00401044 add edx,dword ptr [ebp-8]
00401047 mov dword ptr [ebp-4],edx

根据反汇编代码可以看出 ++i的结果放到了edx中
当他去取 (++i)表达试的时候却是取的 dword ptr [ebp-8]的值
(按理说应该取ecx的值) 但做最后加法的时候dword ptr [ebp-8]的值已经被改变了

我想得到这个题目的语法解释
我感觉应该是 用 3+2=5
输出5的

实际却是输出6
我使用的VC6编译器

我需要的语法解释
语法解释
语法解释
语法解释

是先计算了++i的值后再把两个加起来
第一次 ++i=2; i=2;
第二次 ++i=3; i=3;

i+i=6

例如
#include "stdio.h"
#include "iostream.h"
void main()
{
int i=1,j;
j=i+(++i);
cout<<j;
}
输出是4,一样的道理

ptr [ebp-8]是i的位置, 他是先算了两个++,结果都是保存回i的位置, 然后做 i+i,放在ptr [ebp-4],也就是j的位置。

如果你想要的是C对这个的语法解释的话, 这个做法是C语法不接受的。 在C语言的表达式中,两个序列点之间(在这里就是整个表达式)一个变量只允许赋值一次。 像这种规则外的东西结果就是编译器决定的。

int j, i=1;
j=++i+(++i);
两个++i做加法运算,先把两个++i计算一下:第一个++i计算后i的值为2,第二个++i计算后i的值为3,然后系统在同时用最后的3来替换两个++i部分,即3+3=6