当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 14 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 为什么同一个程序在win和linux运行的结不一样
帖子发表于 : 2007-07-26 22:46 
头像

注册: 2007-07-11 20:59
帖子: 3922
送出感谢: 0 次
接收感谢: 0 次
代码:
#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

这究竟是什么原因呀???望大虾指点!!


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-07-26 23:36 
头像

注册: 2007-03-13 17:26
帖子: 2254
送出感谢: 0 次
接收感谢: 1
知道结果对你也没什么用处,,


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-07-27 14:58 

注册: 2007-07-26 11:03
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
那是由于编译器不同你在LINUX下用的是GCC 你看看MAN GCC里面有很多的选项的,应该是可以配置的和你在WINDOW下用的编译器编译出结果一样的程序的~


页首
 用户资料  
 
4 楼 
 文章标题 : ;)
帖子发表于 : 2007-07-28 0:52 

注册: 2007-07-17 23:19
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
这样的问题,没有讨论的意义。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-07-28 10:07 

注册: 2007-04-25 11:49
帖子: 393
送出感谢: 0 次
接收感谢: 0 次
对-0.5的处理方法不一样吧?一个-0.5进位成0,一个-1


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-08-03 15:09 
头像

注册: 2007-05-10 19:42
帖子: 255
地址: 南京, Deutschland, Karlsruhe
送出感谢: 0 次
接收感谢: 0 次
调试一下就知道哪一步不同了
下次遇到问题,就先调试。一般就可以搞定了


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-08-03 17:05 
头像

注册: 2006-05-12 23:28
帖子: 621
地址: 江西乐平
送出感谢: 0 次
接收感谢: 1
说了半天也没有一个真正调试过的……


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-08-03 22:13 

注册: 2007-05-08 22:11
帖子: 27
送出感谢: 0 次
接收感谢: 0 次
以windows为准把..5楼的应该是对的,条校一下~调到结果和windows一样比较好,那样以后什么考试之类的都不怕


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-08-03 22:23 
头像

注册: 2007-07-11 20:59
帖子: 3922
送出感谢: 0 次
接收感谢: 0 次
我觉得也不能说没有必要 对于我们这种新手来说 觉得这很奇怪 望高手不要打消我们新手的学习的积极性


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-08-03 22:54 

注册: 2006-01-18 15:01
帖子: 1074
送出感谢: 0 次
接收感谢: 1
编译器不同吧。如果都用icc或者都用gcc试试~不要一个用vc6一个用gcc,没比较性。


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-08-04 0:18 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
首先,如果楼主只是编编程序,不想去理解编译器构造,这个问题对你来说没有研究的必要。相反,在实际编程中要尽量避免使用这种形式。

在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


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-08-10 21:38 
头像

注册: 2007-07-11 20:59
帖子: 3922
送出感谢: 0 次
接收感谢: 0 次
"首先,如果楼主只是编编程序,不想去理解编译器构造,这个问题对你来说没有研究的必要"


首先,感谢ls的回帖,你的话使我更想深入得了解这个问题!!!


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2007-09-01 15:15 
头像

注册: 2006-05-12 23:28
帖子: 621
地址: 江西乐平
送出感谢: 0 次
接收感谢: 1
laborer 写道:
相反,在实际编程中要尽量避免使用这种形式。


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


首先,感谢ls的回帖,你的话使我更想深入得了解这个问题!!!


Laborer的是正解。表达式中各个操作数的求值顺序,在语言标准中是未定义的,因此不应写这样的代码,它将影响程序的可移植性。

像这样的代码:
代码:
a[i]=i++;
,它的执行结果显然是高度依赖于编译器的。


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2007-09-04 22:44 
头像

注册: 2006-11-29 11:23
帖子: 24
地址: 老娘肚子
送出感谢: 0 次
接收感谢: 0 次
贴一段vs2005下的e=(a/(++b))-(b/(--a))运行代码:
00413929 mov eax,dword ptr [b]
0041392C add eax,1
0041392F mov dword ptr [b],eax
00413932 mov ecx,dword ptr [a]
00413935 sub ecx,1
00413938 mov dword ptr [a],ecx
0041393B mov eax,dword ptr [b]
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 [b]
0041394B sub eax,ecx
0041394D mov dword ptr [ee],eax

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


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 14 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译