当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 10:05 
头像

注册: 2008-09-25 20:56
帖子: 720
送出感谢: 11
接收感谢: 5
最近在看数据结构与算法的书,写了如下插入排序的程序,gcc4.3.3用I、III没有问题,II则得不到正确的结果,而vc6都没有问题
大神指点 :em70
$gcc -Wall filename.c
I、III输出:45,47,50,56
II输出:45,47,0,50
代码:
#include <stdio.h>

typedef   unsigned char   bool;
#define   true   1
#define   false   (!true)

static  int insert_sort(int* p_arr, int count);

/*
 *插入排序,成功返回0
 */
int insert_sort(int* p_arr, int count)
{
   int res = -1, i = 1;
   int s = 0, e = 0, m = (s+e) >> 1;
   bool incm = false;   /*include m*/

   if(NULL == p_arr || count < 0)
      goto END;

   for(i = 1; i < count; ++i) {
      int ec = 0;   /*exchange time*/
      int j = i;

      s = 0;
      e = j-1;

      while (!(s > e)) {
         if (s == e) {
            incm = p_arr[j] < p_arr[m];
            break;
         } else {   /*s<e*/
            if (p_arr[j] < p_arr[m])
               e = m-1, m = (s+e) >> 1;
            else
               s = m+1, m = (s+e) >> 1;
         }
      }

      /*exchange*/
      for (ec = (incm ? j-m : j-m-1); \
            ec > 0; --ec, --j) {

I
代码:
p_arr[j] ^= p_arr[j-1];
         p_arr[j-1] ^= p_arr[j];
         p_arr[j] ^= p_arr[j-1];

II
代码:
p_arr[j] ^= p_arr[j-1] ^= p_arr[j] ^= p_arr[j-1];

III
代码:
int tmp = p_arr[j];
         p_arr[j] = p_arr[j-1];
         p_arr[j-1] = tmp;

代码:
}
   }
   res = 0;

END:
   return res;
}

#define DLC   4

int main(void)
{
   int i = 0;
   int x[DLC] = {45, 56, 47, 50};
   insert_sort(x, DLC);
   for (i = 0; i < DLC; ++i) {
      printf("%d;", x[i]);
   }
   printf("\n");
   return 0;
}


_________________
UCHIHA
运气是为白痴准备的


页首
 用户资料  
 
2 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 10:44 
头像

注册: 2008-09-25 20:56
帖子: 720
送出感谢: 11
接收感谢: 5
nobody knows ? :em20


_________________
UCHIHA
运气是为白痴准备的


页首
 用户资料  
 
3 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 11:16 
头像

注册: 2008-09-25 20:56
帖子: 720
送出感谢: 11
接收感谢: 5
算了,就用I吧,也清晰一点 :em37


_________________
UCHIHA
运气是为白痴准备的


页首
 用户资料  
 
4 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 17:00 
头像

注册: 2007-06-29 23:04
帖子: 31
地址: 北京
送出感谢: 0 次
接收感谢: 1
看着好头晕啊,楼主移位是干什么的?? :em20

赋值语句最好分开写,否则很容易出问题


页首
 用户资料  
 
5 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 17:21 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
手头没有 gcc 4.3.3


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 18:37 
头像

注册: 2008-09-25 20:56
帖子: 720
送出感谢: 11
接收感谢: 5
kiddult 写道:
看着好头晕啊,楼主移位是干什么的?? :em20

移位是除2,听说这样效率会高一些 :em06

kiddult 写道:
赋值语句最好分开写,否则很容易出问题

貌似是的哦,gcc就出问题了,vc6就没问题 :em20 ,不知道gcc别的版本怎么样


_________________
UCHIHA
运气是为白痴准备的


页首
 用户资料  
 
7 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 18:40 
头像

注册: 2008-09-25 20:56
帖子: 720
送出感谢: 11
接收感谢: 5
注释有点少了,s是start,e是end,m是middle,j是i的替代品,防止i被无意间修改 :em06
不过这些都不是关键,关键是连赋值,难道这种写法不提倡了还是会出问题,抑或是可读性不好?


_________________
UCHIHA
运气是为白痴准备的


页首
 用户资料  
 
8 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 19:56 

注册: 2007-10-27 1:04
帖子: 403
送出感谢: 0 次
接收感谢: 1
同疑惑。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 23:31 
头像

注册: 2008-07-09 17:05
帖子: 36
地址: 北京
送出感谢: 0 次
接收感谢: 0 次
代码:
#include <stdio.h>

int main(int argc, char** argv)
{
   int a,b;
   a = 5;
   b = 10;
   
   a ^= b ^= a ^= b;
   
   printf("%d\t%d",a,b);
   
   return 0;
}


验证了一下,gcc会给警告,但是不会报错,运行正常。


_________________
wyapples@wyapples-laptop:~$ sudo fo~a~ke GreatFW
[sudo] password for wyapples:
================
Welcome to fo~a~ke the GreatFW
================
Times:1000
Strength:High
OK,let's go!
-----------100% done------!
wyapples@wyapples-laptop:~$ I feel tired...


页首
 用户资料  
 
10 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-13 23:42 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
wyapples 写道:
代码:
#include <stdio.h>

int main(int argc, char** argv)
{
   int a,b;
   a = 5;
   b = 10;
   
   a ^= b ^= a ^= b;
   
   printf("%d\t%d",a,b);
   
   return 0;
}


验证了一下,gcc会给警告,但是不会报错,运行正常。


应该是这样的
简化版

a ^= a ^= b;

发生了这几件事
1. a ^ b
2. 1 的结果赋给 a
3. a ^ 1 的结果
4. 3 的结果赋给 a

2, 3 在 1 后发生
4 在 3 后发生

2 与 3
2 与 4 不确定了


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
11 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-14 8:04 
头像

注册: 2008-09-25 20:56
帖子: 720
送出感谢: 11
接收感谢: 5
BigSnake.NET 写道:
wyapples 写道:
代码:
#include <stdio.h>

int main(int argc, char** argv)
{
   int a,b;
   a = 5;
   b = 10;
   
   a ^= b ^= a ^= b;
   
   printf("%d\t%d",a,b);
   
   return 0;
}


验证了一下,gcc会给警告,但是不会报错,运行正常。


应该是这样的
简化版

a ^= a ^= b;

发生了这几件事
1. a ^ b
2. 1 的结果赋给 a
3. a ^ 1 的结果
4. 3 的结果赋给 a

2, 3 在 1 后发生
4 在 3 后发生

2 与 3
2 与 4 不确定了

我的目的是将a,b交换,“a ^= a ^= b;”这样不行吧 :em20
大家可以运行一下我的代码,应该就能看到错误了,话说回来,这确实不是什么大不了的问题
wyapples 写道:
代码:
#include <stdio.h>

int main(int argc, char** argv)
{
   int a,b;
   a = 5;
   b = 10;
   
   a ^= b ^= a ^= b;
   
   printf("%d\t%d",a,b);
   
   return 0;
}


验证了一下,gcc会给警告,但是不会报错,运行正常。

既然gcc会给出警告,估计是这种写法已经过时了,大家还是不用的好 :em06


_________________
UCHIHA
运气是为白痴准备的


页首
 用户资料  
 
12 楼 
 文章标题 : Re: GCC4.3.3有BUG???VC6则没问题
帖子发表于 : 2009-09-14 12:53 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
我说的是简化版... 四个变量同理, 不过情况数更多, 更复杂


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


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

当前时区为 UTC + 8 小时


在线用户

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


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

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

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