a和a在c语言中差多少,在c语言中y=(++a)+(++a)+(++a),那么y的值是多少呢?

博客讨论了C语言中预增运算符(++a)的实现差异,指出不同编译器如VC6.0、Borland C++和g++在处理预增运算时的行为不一致,导致结果各异。文章提到,虽然C规范有明确解释,但实际编译器可能基于效率考虑采取不同策略,例如Borland C++和g++为提高效率牺牲了与规范的一致性。作者通过代码分析揭示了这些差异,并强调概念理解与实际运行效果的差异。
摘要由CSDN通过智能技术生成

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所说:概念只是存在于书本,只有我们使用到了才是有用的,事实才能判断一切.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值