求高人解答:同一段程序在vc++ 6.0与turbo c运行结果不同的问题

谭浩强老师的C语言程序设计一书中有如下程序:
j=5;q=(++j)+(++j)+(++j);printf("%d",q);
在turbo c中结果为24(同书中结果),在vc++ 6.0中结果为22。
意味着在turbo c中编译时,会将整行读完,运算3个++j之后再算q;
而VC++先运算头两个++j(第一步加法的加数),再相加,再运算第三个++j,再计算出q值。

为了测试,将程序改为
j=5;q=0+(++j)+(++j)+(++j);printf("%d",q);
结果不变,也就是说VC++依然头两个++j(头两步加法的加数)

改为 j=5;q=j+(++j)+(++j)+(++j);printf("%d",q);
在turbo c中结果为32(4个8相加),在vc++ 6.0中结果为27(6+6+7+8),此时VC++又先处理第一步加法的加数了。

完整猜测如下:
turbo c的编译方式 是将整行读完后再运算;
VC++则是分步计算,类似于用栈进行四则运算的方法,并且预读的不是第一步运算,而是头两个变量。

跪求高人从编译器的编译方式角度给予原理性的解答!
另外二级C是用TC么?程序员考试(软考)用什么环境?
从结果上我可以分析出两个编译器间的差别,希望诸位的答案能给出编译器源码上的证明!个人是因为爱好和好奇心而非过级。。。
最新回答
微浅笑°

2024-07-02 00:10:06

造成这种结果 是 C语言在 ++j 定义上 的不严密性 造成的。

q=(++j)+(++j)+(++j); 这同编译器编译时 的优化处理方式有关。

VC++ 编译 时, 若编译选项 选用 优化 /O1 或 优化 /O2 ,结果 为 24
/O1 minimize space 省空间优化
/O2 maximize speed 使运算速度最快优化
默认结果为不优化,得 22。
衍衍暮行款

2024-07-02 05:56:59

你好!

这个问题我之前也纠结过,你可以参考下下面的介绍。
http://www.chineselinuxuniversity.net/articles/19490.shtml

我之前的那个题目是
int i = 3;
printf("%d\n", (++i) + (++i) + (++i));
printf("%d\n", i);
TC下面的答案是:15和6
VC下面的答案是:16和6
我也不太清楚原因。

另外:二级C正常情况下是用VC++6.0,软考下午的编程考试是笔试,具体可以查看网上的介绍,我记得是五道必做题(C语言),还有一道选做题(选用C++的STL或者JAVA)。

希望我的回答能对你有所帮助!
如果满意记得采纳为最佳答案哦!~
如果还有问题,可以BaiduHi我,O(∩_∩)O~!
看不见的坚强

2024-07-02 04:18:45

像这样连续自增的带歧义的函数,两种编译器采取的计算方式不同,一个是先自增一个是现相加,而造成结果不同。
百般娇

2024-07-02 01:00:21

TC是以一条语令为单位编译,VC以一次计算为单位,VC中“++”不算一次计算。
相逢即是缘分

2024-07-02 05:39:51

这个问题对你过级没什么太大的帮助,你可以反汇编一下看看。C标准中没有对这个做明确要求,所以不同编译器的实现是不同的。你弄明白这两个过编译器以后还可能遇到GCC之类的还是出问题,别人也看不懂你写的程序。
别弄这个了,你走弯路了。
魅影狂杀

2024-07-02 01:57:05

语言没有对此作强制规定,如果编译器不同结果就很可能不同。