找回密码
 立即注册
搜索
查看: 271|回复: 14

( ++i )+( ++i )+( ++i )问题,大侠近来看看!

[复制链接]

498

主题

5866

回帖

8541

积分

网站编辑

LMSung

积分
8541
发表于 2004-8-10 16:11:04 | 显示全部楼层 |阅读模式
#include<stdio.h>

main()

{

int i=3,h;

h=( ++i )+( ++i )+( ++i );

printf("h=%d\n",h);

}

这一程序在turboc2下运行等于18,而在dev-C++和VC上运行是等于16。请问这是为什么

我知道ANSI C没有规定运算顺序

但是能不能详细说一下 16和18 分别是怎么来的?谢谢

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
发表于 2004-8-10 16:42:24 | 显示全部楼层
这就是典型的c语言存在二义性的问题。

c语言具有很多二义性的地方,这就是为什么用C语言开发时,最头疼的就是出错阶段,代码怎么看都没问题,就是结果不正确,为什么招聘C开发者都要求多少年的经验就在这里,他必须把这些东西熟练记住才行。

看看下面的代码有没有问题:

p==0 ? p+=1: p+=2;

实际上由于操作符优先关系p+2永远不能执行。如果没有经验,那么就很难找到问题。
回复

使用道具 举报

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
发表于 2004-8-10 17:16:55 | 显示全部楼层
可以分别编译出汇编代码来看一下就明白了。
TC由于预编译,可能只有 MOV AX,18 一句。(自动预计算)。后两者采用计算方式,引入几个中间寄存器,也就是把(++i)表示成三个不同数据来对待,才出现这种情况。不管16还是18都有道理。
回复

使用道具 举报

42

主题

835

回帖

1167

积分

金牌会员

积分
1167
发表于 2004-8-10 19:36:38 | 显示全部楼层
前两个()先自加,再相加,再和最后一个()相加,结果是16
BTW:tc都是什么年代的编译器了,还在用啊?
回复

使用道具 举报

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
发表于 2004-8-10 20:44:18 | 显示全部楼层
可以把TC的优化编译选项关闭后,再运行试试。以前有的参考手册好像会举类似例子,以表明该编译器的特性。反正标准C的具体实现有所特殊。好像TC手册会列出一些极端情况的计算顺序,像+++++++i之类的。

TC编译器,很多人都比较熟悉,他在编译阶段尽可能把能计算出来的值首先变成具体值。为了加快程序运行效率。其他编译器不太了解。反正,使用C编程,拿不准的地方,必须用()进行强化。
回复

使用道具 举报

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
发表于 2004-8-10 20:45:21 | 显示全部楼层
h=(( ++i )+( ++i ))+( ++i );

在TC里,改成这样在运行一下。
回复

使用道具 举报

498

主题

5866

回帖

8541

积分

网站编辑

LMSung

积分
8541
 楼主| 发表于 2004-8-10 21:41:31 | 显示全部楼层
感谢 xug

看来TC在这方面还是很符合ANSI C的!


认准一个就这样下去吧!哈哈
回复

使用道具 举报

498

主题

5866

回帖

8541

积分

网站编辑

LMSung

积分
8541
 楼主| 发表于 2004-8-10 21:45:36 | 显示全部楼层
想了一下
TC肯定是 三个i同时运行++i 得到6+6+6以后付给h=18

16就是你说的!!前两个5相加=10,这样10就是常量和i没有关系了!然后再加上后面的i=6
最后=16
回复

使用道具 举报

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
发表于 2004-8-10 22:57:04 | 显示全部楼层
16这个结果用该说是不正确的,最后一次++i只是部分有效,不符合同一变量运算影响全周期的定义。但这也只能理解为编译器本身的性能差异。也算是一个BUG吧。++优先级高于+,所以,肯定先执行三遍++i,然后,再执行两次加法才对。
回复

使用道具 举报

498

主题

5866

回帖

8541

积分

网站编辑

LMSung

积分
8541
 楼主| 发表于 2004-8-11 00:29:37 | 显示全部楼层
谢谢!
dev-C++里面的GCC也16
昏倒!

真是乱死了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|海浩社区

GMT+8, 2025-9-20 01:39 , Processed in 0.101735 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表