回复 32# 的帖子
看到广陵的帖子,我思考了一下,然后决定做试验。我没有TC,所以只试验了Visual C Compile 15.0(即vc2008)和minGW GCC 3.4.5编译器。
经过适当修改(main()这种函数G++报错),得到一下结果:
VC:90(符合大家的期望)
GCC:60(?为什么?)
90很好理解。假设了先进行副作用的运算,再相加,且运算方向从左向右。
10+5=15,然后15*3=45,45+45=90。
但60的结果怎么来的呢?我反汇编了GCC的编译结果,原来,GCC对第一个运算(i+=5)和第二个(i*=3)采用了不同的寄存器来运算。于是在做i=i+i的时候,i的第一个值(即15那个值)被丢弃,i=i+i即相当于30+30=60。
再说一遍,这样的题目毫无意义,以后遇到这种题目,答案就是一种,就是未定义!!
这里回广陵。很多实用的程序都是用C写的。就算不是用C,也是用和C大有渊源的C++(可以说Win32上这样的程序占了99%),而且,GCC和VC都是十分流行的编译器。这样的编译器上,结果都不一样,你指望这道题还有什么研究的意义??
你要我举个例子吗?IE是C写的。QQ是C++(明显看出MFC的痕迹),而千千静听则是使用WTL写的——另一个高效简洁的C++库,而千千静听的解码器,则是使用纯C完成,而使用COM包装了的。试问,现在有谁不用这三样软件?(就算你用Linux吧,Linux上面大部分软件也是C/C++的产物)
作为计算机系的学生,我深知编译原理的重要性。我们已经开了编译原理课程,而且相信大多数计算机系和非计算机系都将开设这门课(课本前言的原话),你说懂得编译器运行原理的人有多少?至少专门学计算机的不可能不了解。
最后一个问题。你说不要人云亦云。标准也是人云亦云吗?好,就算我不相信标准,我亲自做了试验(这是我这次发帖的缘由,也是我耐着性子做这个试验的缘由,事实上,如果两个编译器结果相同,我有个解释运行版本的C,在那个上面,结果一定是不同的,原因,学过编译原理的都懂。),这也叫人云亦云吗?这种问题,我希望(同样,我也不喜欢“希望”这个词,因为根本不可能实现!)大家不要再追究这种东西了。完全没有追究的价值。
再说一遍,“磨刀不误砍柴工”,了解标准并不是人云亦云,学习标准设立的思想也不是人云亦云。如果你都人云亦云去了,谁去继承前人的成果?如果每个人都持怀疑的态度的话,谁去研究那些进步的科技?怀疑是必要的,但是是要在自己有了怀疑的资格以后才能去怀疑的。在还没有怀疑的资格的时候,请相信权威!