注册 登录
编程论坛 C++教室

为什么是这个结果啊,大家帮忙看一下!

惜缘 发布于 2010-10-04 19:29, 1026 次点击
main()
{
int i=3,j=0;
j=i++*++i+i--*--i;
printf("i=%d\n",i);
printf("j=%d",j);
printf("表达式=%d\n", i++*++i+i--*--i);
}
用tubor c 2.0 运行的结果是:i=3 j=18 表达式=30
可是用VC++ 6.0运行的结果是:i=3 j=25 表达式=25
我想知道 为什么j=25和表达式=25,这两个结果我不太明白,怎么算出来的!
请大家帮忙看一下!
11 回复
#2
聋眼睛瞎耳朵2010-10-04 20:38
我在VC2005里运行的结果是:3  j=18  表达式=18 根据程序也应该是这样的结果才是
#3
聋眼睛瞎耳朵2010-10-04 20:38
我在VC2005里运行的结果是:3  j=18  表达式=18 根据程序也应该是这样的结果才是
#4
cnfarer2010-10-04 21:25
不要写这样的表达式就行,按你预期的方式来写,不要连在一起,这并不是高深,只能算游戏(根本得不到你想要的结果,甚至在不同编译器下,结果都是不同的,因此其结果不可预期),如果你想编程的话,千万别写这样的表达式!
我们有很多“专家”就喜欢搞这些无聊的东西,来误导人!
#5
tornador2010-10-04 21:52
这个跟编译器对如何处理具有副作用表达式的语句的方法有关了。
在VC++中处理方法是4*4+3*3。在turbo中的处理方法是3*3+3*3。
在VC++中同一个表达式中的i++不会影响到i的值,可以通过下列程序验证
void main()
{
int a=3;
int b=(a++)+(a++)+(a++);
cout<<b<<endl;
}
结果输出是9。
不同的编译器对待这种具有副作用的表达式的方法是不同的,所以在实际编程中要尽量少使用这样的语句,否则会出现难以预料的结果。
#6
zaq20082010-10-05 14:39
编译器实现问题
根据标准应该是30的
但在语句处理上只处理第一个自增或自减运算
#7
lscalin2010-10-05 14:46
如果一定要用到多重自增看减请一定要用上括号,不然问题多多呀,
#8
tansuo2010-10-07 22:14
可能是编译系统处理输出流的顺序不一样。我觉得还是不要用自加自减比较好。
#9
longzhixuan2010-10-08 20:34
标准的计算结果应该是3,30,30,这与编辑器有管!
#10
南国利剑2010-10-08 21:52
以下是引用cnfarer在2010-10-4 21:25:21的发言:

不要写这样的表达式就行,按你预期的方式来写,不要连在一起,这并不是高深,只能算游戏(根本得不到你想要的结果,甚至在不同编译器下,结果都是不同的,因此其结果不可预期),如果你想编程的话,千万别写这样的表达式!
我们有很多“专家”就喜欢搞这些无聊的东西,来误导人!
同意这种看法、
#11
南国利剑2010-10-08 21:56
这个问题跟编译器的类型有关,也跟调用方式有关。
#12
mjljane2010-10-09 09:31
tubor c 2.0和VC++ 6.0处理过程不同的
1