cam350做钢网流程介绍:在c语言中y=(++a)+(++a)+(++a),那么y的值是多少呢?

来源:百度文库 编辑:神马品牌网 时间:2024/05/10 12:39:50
在c语言中y=(++a)+(++a)+(++a),那么y的值是多少呢?a=3,y的值是15还是18呢?
我看了两本参考书分别给出了不同的答案!
请哪位大侠帮帮忙!

首先明确执行顺序,有括号的先执行括号中语句,由于问题中的语句有三个括号,则应该自左向右的顺序执行。
++a的意思是在使用a之前把a加1。
现在假设a的初始值为A,根据之前所说的执行顺序,先执行左边第一个括号,结果为A+1,再相继执行后面两个括号,注意到a的值已经在上一次运算中发生变化,所以后面两个括号的结果分别为A+2和A+3,最后将三个括号结果相加,y=3A+6,把A=3代入,结果为15.
但是这只是按照标准C的规则得到的答案,不同的编译器有不同的解释方法,所以实际上可能得到不同的结果。

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

编译器不同,可能会出现不同的结果。

用 MS VC++ 和 linux cc, linux gcc 得 15.00

程序中最好不要用二义性或多义性的语句形式,编译器不同,可能会出现不同的结果,给自己带来麻烦。

把 y=(++a)+(++a)+(++a)
拆开来,写明确了多好:
a = 3;
a = a + 1;
y = a + a + a;
-----------------
或:
a = 3; b = a + 1; c = b + 1; d = c + 1;
y = b + c + d;

语句是为人服务的,程序员要做语句的主人。

书是人写的,书上错的东西有的是。书为我而用,取其精华,去其糟粕。

我来说一下哦
里面一共出现3个++a
第一个++a的值是3自+所以是4,此时a的值是4了
第二个++a的值就是4自+,所以是5,此时a的值就是5了
第三个++a的值就是5自+,所以是6
所以y=4+5+6=15

不同的编译器会有不同的答案


int i;
i=(++i)+(++i)+(++i);

TC 2.0等与 12
vc 等与10
有的等于 9

受不了了,怎么那么多人答15,虽然这个问题很没意义,但别误导人家。
15不是不对,但15只是一个编译器的实现结果,个个编译器的实现不同,此题的结果是与编译器相关的

所以标准答案,是没有标准答案
按照标准,在一个表达式内对同一变量多次++,结果是不确定的,完全是各个编译器自己说了算,我记得TC,BC,gcc和VC的答案有的就不一样
所以以上各楼的答案可以说都对,又都不对

另,楼上的人别说“绝对,我的老师说的”之类。老师犯错多了,我们大学老师上课错误我能听出一箩筐,呵呵。这类问题虽然很无聊,但还是参阅一下标准再回答比较好,毕竟道听途说来的答案会误导人的。

参考引用地址的最后一条

15
“=”是自右向左运算

(++a)+(++a)+(++a)
6 + 5 + 4 =15

正确答案是15我是问的我的大学老师啊!!!
是绝对对的@@
就是=是从右往左算的一个一个自增1的
6+5+4=15
我的回答也许不是很详细能帮助你是我高兴的事!!