以前回答过别人的两个问题,你参考一下: 1、*p++只是C语言的一种表达方式,其它计算机语言很少使用这种表达方式。这表达确实有争议,他破坏了逻辑性。 这个表达式实际上是两个独立的表达式:*p;p++;因为是两个独立的表达式所以不存在运算符优先的问题,谁在前谁先算。所以不管怎么样都会先算*p *++p实际上是:++p;*p;所以不管怎样都会先算++p 如果你要彻底了解其计算方法,在VC中对调式时打 展开
以前回答过别人的两个问题,你参考一下: 1、*p++只是C语言的一种表达方式,其它计算机语言很少使用这种表达方式。这表达确实有争议,他破坏了逻辑性。 这个表达式实际上是两个独立的表达式:*p;p++;因为是两个独立的表达式所以不存在运算符优先的问题,谁在前谁先算。所以不管怎么样都会先算*p *++p实际上是:++p;*p;所以不管怎样都会先算++p 如果你要彻底了解其计算方法,在VC中对调式时打开反汇编就一目了然了。 2、谁能给我解释几条表达式? 20分 回答:3 浏览:93 提问时间:2009-03-14 18:07 i初始值是3 为什么表达式: K=(i++)+(i++)+(i++) 的运算结果是:9 K=(++i)+(++i)+(++i) 的运算结果是:18 不明白,第一条表达式我还算有点模糊的理解了一点,但第二条我实在搞不懂:i的初始值是3第一次运算时就变为4吧,第二次运算时i所用的值是哪个?第三次呢? =============================== 答:对于这个表达式怎么编译还没有形成标准,编译器的结合方向不同,答案因此会有所不同,VC6.0下第二个表达示的计算结果是16,而有些编译器计算结果是18. 我针对你的答案解释: 1、首先不管是前置++还是后置++,由于++的优先级高于加法运算的+,所以不管怎样在这两个表达式中都会先算++,后再算+,题目中的运算顺序写出来就是这样:(++)(++)(++)++=,题目中两个表达式的运算顺序都是这样,注意=号也是个运算。搞清楚了他们的运算顺序再看下面。 2、++这个运算符包含三个运算,即加、赋值、取值。把这三个运算放到整个表达式中。 3、前置++是“先加后取值”,后置++是“先取值后加”,也就是说前置的++和后置的++内部是隐含有优先级的(重点在这里)。怎么理解? 后置++:遇到++时就取值,遇到=号才赋值。这意味着后置++中赋值运算低于表达式中=号运算。题目套用1中的(++)(++)(++)++= 这个运算顺序就是:取i值;取i值;取i值;加法运算;=号运算;赋值(3次i++)。换句话说,不管这类表达式有多长,一句话,先取值,再相加,最后才改变i的值。本题具体就是:3+3+3=k;i=i+1;i=i+1;i=i+1;所以k=9。 前置++:遇到++时就加,紧接着赋值,遇到第一个需要取值的运算符号时就取值。换句话说,不管这类表达式有多长,一句话先加并改变值没商量,再进行算术运算。答案就出来了:++i,++i,++i;取i值;取i值;取i值;加法运算;=号运算;具体就是:i=i+1;i=i+1;i=i+1;(此时i进行了3次加法,故=6)6+6+6=k 对于第二个表达式,有的编译器对表达式按加法顺序运算,结果就是:K=((++i)+(++i))+(++i) =(5+5)+6=16 了解计算规则后,对象这样的表达式k = (i++) + (++i) + (--i) + (i++);也就能算出来了:(原值)+(i+1)+(i-1)+(上一个i-1后的值)=3+4+3+3=13。但有的编译器会采用前置++优先级高于后置++并按加法顺序运算的规则,那么就是这样算:k = (i++) + (++i) + (--i) + (i++)=(((i++)+(++i))+(--i))+(i++)+(i++)=(((++i)+(i++))+(--i))+(++i)= ((4+4)+3)+3=14 不知你看明白没有?可以给我留言,祝你成功! 收起