问题描述:
例:当i=3,i++*++i+i--*--i
在不同的系统中的结果是不同的,在TC中做参数和计算时的结果不同,比如TC和VC也是不同的,能不能具体解释一下是怎么得到的,最好有过程
在TC系统里,,i++*++i+i--*--i ,做参数如:printf("%d",i++*++i+i--*--i );与在程序中的参数不同
问题解答:
int i=3;
i++*++i+i--*--i;
结合顺序是这样的,(i++)*(++i)+(i--)*(--i);
计算过程是这样的: 4*4+3*3;
首先 (i++)//事后计算,i还是3;参与运算的是i,
(++i)//直接计算,i变成4;参与运算的是i,
(i++)*(++i)实际是i*i//变成了4*4; 此时的i是4.
其次 (i--)//事后计算,i还是4;参与运算的是i,
(--i)//直接计算,i变成3;参与运算的是i,
(i--)*(--i)实际上是i*i//变成了3*3;此时的i是3.
然后 16+9得到结果.
最后 (i++);//i变成4;
(i--);//i变成3;
所以式子的值是25,变量i变成了3.
这是在VC中的运行方式,不知道在其它编译器是什么情况,请高手出来指导一下.
在dev-c++中也是这样.
不过在dev-c++和vc中,其它情况下也可能是有区别的.
3*5+5*3=30
原因:
运算符的优先级:(从上到下递减)
++ ++
* % /
+ -
当然要先算 ++ --了,
算过之后就是 3*5+5*3
至于自增自减的情况,应该不用多说吧
ANSI C并没有对表达式中的子表达式的求值顺序做出规定,允许编译系统自行确定。所以,在VC中的计算规则确实如同网友ninigou所说的一样
而在TC中,对于i=3,i++*++i+i--*--i的值,系统按照从左到右顺序求解,即先计算i++,实现i值增1变为4,再求++i,此前,i值为4,执行++i后,i值为5,依此规则,最终结果为 30 .
你又测试过吗?我觉得应该是相同的呀
如果不同,我觉得应该是由于计算的顺序造成的
也就是一种可能是先算i++*++i 就是3*5+5*3=30
另一种可能是先算i--*--i 3*1+1*3=6
你说的不同是这两个答案吗?
估计是这样:1种,3×5+5×3=30 自左向右进行自加自减
2种,2×2+2×2=8 自右向左进行自加自减
好像是这样不通软件有不同的设置