LZ,这个题目按照C规范来说的确等于15,但是实际上每个编译器对规范的支持都不相同,如果LZ是应付考试的话,15应该是正确的,因为使用规范上的++解释来作为考试是绝对天经地义的.处于对楼上几位XD的尊重,使用事实来说话.我用了3个编译器测试了一下,结果全部不为15,这个++a和a++的实现,由于栈结构的操作差异,每个编译器都不相同,我同时比较了VC6.0 borland C++ Build6 redhat 7.0自带的g++,结果是Vc6.0是16,bcb是18,g++是18.由于我上网的机器是windows,所以g++的实现我没办法粘贴过来,下面是VC6.0和BCB的实现,大家仔细看一下就知道了,g++的实现我比较了,和bcb是一样的,详细的地方我注释了:
VC6.0:
6: int a =3,y;
00401548 mov dword ptr [ebp-4],3 'a是[ebp-4]
7:
8: y=(++a)+(++a)+(++a);
0040154F mov eax,dword ptr [ebp-4]
00401552 add eax,1 '首先a+1值4进eax
00401555 mov dword ptr [ebp-4],eax 将4赋值给a
00401558 mov ecx,dword ptr [ebp-4]
0040155B add ecx,1 '然后a的值4加1为5进ecx
0040155E mov dword ptr [ebp-4],ecx '将5赋值给a
00401561 mov edx,dword ptr [ebp-4] 'edx进5
00401564 add edx,dword ptr [ebp-4] '将edx+a 得10进edx
00401567 mov eax,dword ptr [ebp-4] 'eax进5
0040156A add eax,1 '将eax+1得6进eax,注意,这步是关键,vc是先进2运算1步后再进1.
0040156D mov dword ptr [ebp-4],eax 将6赋值给a
00401570 add edx,dword ptr [ebp-4] 将edx+a得16进eax
00401573 mov dword ptr [ebp-8],edx 将edx得值给y
BCB:
Unit1.c.11: int a =3,y;
mov [edp-0x04],0x00000003 'a赋值3
Unit1.c.13: y=(++a)+(++a)+(++a);
inc dword prt [edp-0x04] 'a值+1为4
inc dword prt [edp-0x04] 'a值+1为5
inc dword prt [edp-0x04] 'a 值+1 为6,注意bcb得操作,先将a连续加3次.和VC有差别
mov eax,[edp-0x04] '将a值6给eax
add eax,[edp-0x04] ' 将eax+a值6得12给eax
add eax,[edp-0x04] '将eax+a值6得18给eax
mov [edp-0x08],eax '将eax值给y
比较可知道:vc得操作更能表示++a是一个表达式得思想(采用独立寄存器保存++a得值.不像bcb直接将++a得值存在a中),但是由于栈操作得顺序,导致和规范有差异(我想原因应该是微软比较排斥不是自己开发得规范吧呵呵)
希望我得解释能给这个永恒得争论得解决一点帮助,需要提醒LZ和楼上各位得是:BCB和G++之所以这么做,引用原BCB得设计者得话来说,是对效率的尊重,与其为了一个很混淆的++概念的完美实现,不如牺牲一点和规范的不兼容来得到高效率,在这一点上,通过上面的代码可知,从++的实现,BCB和G++要远高于VC的效率.所以就和楼上XD所说:概念只是存在于书本,只有我们使用到了才是有用的,事实才能判断一切.