为什么同一个程序在win和linux运行的结不一样

软件和网站开发以及相关技术探讨
回复
头像
chattan
帖子: 3922
注册时间: 2007-07-11 20:59
联系:

为什么同一个程序在win和linux运行的结不一样

#1

帖子 chattan » 2007-07-26 22:46

代码: 全选

#include<stdio.h>
int main()
{
int a=1,b=2,c,d,e;
c=(-a++)+(++b);
d=(b--)+(++a)+a;
e=(a/(++b))-(b/(--a));
printf("c=%d,d=%d,e=%d\n",c,d,e);
} 

win的结果是: c=2,d=9,e=-1
linux的结果是: c=2,d=9, e=0

这究竟是什么原因呀???望大虾指点!!
头像
windwiny
帖子: 2254
注册时间: 2007-03-13 17:26

#2

帖子 windwiny » 2007-07-26 23:36

知道结果对你也没什么用处,,
lihai_suc
帖子: 3
注册时间: 2007-07-26 11:03

#3

帖子 lihai_suc » 2007-07-27 14:58

那是由于编译器不同你在LINUX下用的是GCC 你看看MAN GCC里面有很多的选项的,应该是可以配置的和你在WINDOW下用的编译器编译出结果一样的程序的~
chenbob
帖子: 6
注册时间: 2007-07-17 23:19

;)

#4

帖子 chenbob » 2007-07-28 0:52

这样的问题,没有讨论的意义。
magiciany
帖子: 393
注册时间: 2007-04-25 11:49

#5

帖子 magiciany » 2007-07-28 10:07

对-0.5的处理方法不一样吧?一个-0.5进位成0,一个-1
头像
boydd
帖子: 255
注册时间: 2007-05-10 19:42
来自: 南京, Deutschland, Karlsruhe
联系:

#6

帖子 boydd » 2007-08-03 15:09

调试一下就知道哪一步不同了
下次遇到问题,就先调试。一般就可以搞定了
头像
FFFrog
帖子: 621
注册时间: 2006-05-12 23:28
来自: 江西乐平
联系:

#7

帖子 FFFrog » 2007-08-03 17:05

说了半天也没有一个真正调试过的……
together4233
帖子: 27
注册时间: 2007-05-08 22:11

#8

帖子 together4233 » 2007-08-03 22:13

以windows为准把..5楼的应该是对的,条校一下~调到结果和windows一样比较好,那样以后什么考试之类的都不怕
头像
chattan
帖子: 3922
注册时间: 2007-07-11 20:59
联系:

#9

帖子 chattan » 2007-08-03 22:23

我觉得也不能说没有必要 对于我们这种新手来说 觉得这很奇怪 望高手不要打消我们新手的学习的积极性
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01

#10

帖子 xiechy » 2007-08-03 22:54

编译器不同吧。如果都用icc或者都用gcc试试~不要一个用vc6一个用gcc,没比较性。
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#11

帖子 laborer » 2007-08-04 0:18

首先,如果楼主只是编编程序,不想去理解编译器构造,这个问题对你来说没有研究的必要。相反,在实际编程中要尽量避免使用这种形式。

在vc 2005中,一个表达式中的++x操作都是先做的,可以看一下下面这个例子

代码: 全选

a=0;
a = a + (++a) + (++a);
这个结果是6,其运算过程相当于

代码: 全选

a=0;
++a;
++a;
a = a + a + a;
是用gcc就不一样了,这个表达式的运算过程变为

代码: 全选

a=0;
++a;
t = a + a;
++a;
a = t + a;
结果为4
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
头像
chattan
帖子: 3922
注册时间: 2007-07-11 20:59
联系:

#12

帖子 chattan » 2007-08-10 21:38

"首先,如果楼主只是编编程序,不想去理解编译器构造,这个问题对你来说没有研究的必要"


首先,感谢ls的回帖,你的话使我更想深入得了解这个问题!!!
头像
FFFrog
帖子: 621
注册时间: 2006-05-12 23:28
来自: 江西乐平
联系:

#13

帖子 FFFrog » 2007-09-01 15:15

laborer 写了:相反,在实际编程中要尽量避免使用这种形式。
chattan 写了:"首先,如果楼主只是编编程序,不想去理解编译器构造,这个问题对你来说没有研究的必要"


首先,感谢ls的回帖,你的话使我更想深入得了解这个问题!!!
Laborer的是正解。表达式中各个操作数的求值顺序,在语言标准中是未定义的,因此不应写这样的代码,它将影响程序的可移植性。

像这样的代码:

代码: 全选

a[i]=i++;
,它的执行结果显然是高度依赖于编译器的。
头像
al_kk
帖子: 24
注册时间: 2006-11-29 11:23
来自: 老娘肚子
联系:

#14

帖子 al_kk » 2007-09-04 22:44

贴一段vs2005下的e=(a/(++b))-(b/(--a))运行代码:
00413929 mov eax,dword ptr
0041392C add eax,1
0041392F mov dword ptr ,eax
00413932 mov ecx,dword ptr [a]
00413935 sub ecx,1
00413938 mov dword ptr [a],ecx
0041393B mov eax,dword ptr
0041393E cdq
0041393F idiv eax,dword ptr [a]
00413942 mov ecx,eax
00413944 mov eax,dword ptr [a]
00413947 cdq
00413948 idiv eax,dword ptr
0041394B sub eax,ecx
0041394D mov dword ptr [ee],eax

从代码中可以看到,系统先进性++b和--a操作,然后才计算除法和最后的减法,故结果为-1.
回复