读书人

c来指点迷津。真的弄不明白了

发布时间: 2012-02-09 18:22:27 作者: rapoo

c高手进来,指点迷津。真的弄不明白了
#include <stdio.h>
main()
{
int i = 3;
int m = (++i)+(++i)+(++i);
printf( "%d %d\n ",i,m);

}

[解决办法]
和编译器有关
[解决办法]
vs2005 结果等于18.....
[解决办法]
用VC结果也是6 16

i=6 不用过多解释了吧,i自加了三次
m=(++i)+(++i)+(++i)//
(1) (2) (3)
执行步骤:1  ++i(3) //i=4
2 ++i(2) //i=5
3 (2)+(3) //此时相当于执行i+i 而些时i=5,结果是10
      4   ++i(1) //i=6
5 (1)+10 //6+10=16
[解决办法]
尽量少用i++,++i这种东西,很难有正确的语义保证的,即使有标准规定其语义,无奈编译器何!
[解决办法]
这种东西唯一恰到好处运用的地方就是考试,而非软件。
[解决办法]
搜一搜老贴,

或者看一下对应的汇编代码,就明白了
[解决办法]
C99/C90标准没有制定顺序点前面子表达式的计算顺序。
同理,f(x++,x++*y,x++*3)这种函数调用也是没有办法明确说出其结果的。
[解决办法]
编程最重要的是让人一目了然,不是买弄小聪明,这种东西实在没什么用处,即使是考试,也肯定是误导人啊
[解决办法]
就相当于是4+5+6=16,i最后是6。好像标准C++语法就是这样的。只是这种东东没多大意思,可能就是考试喜欢考,实际中,很少有人这样用。
[解决办法]
不要在式子中修改另一个项的值,因为编译器会打乱求值得顺序,并不严格按照我们常识去做。

比如a + b + c

编译器可能
1。b + c --> t
2。a + t

如果你a 修改了c的值,那么各种排列的结果就不能保持一致了(但是编译器有权选择任意一种排列)

读书人网 >C语言

热点推荐