当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 【求助】Ubuntu10.04下gcc编译的一个诡异的问题……
帖子发表于 : 2010-06-13 11:35 

注册: 2010-03-31 14:02
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
在用vim写一个程序的时候,偷懒将两个数的交换写成:

代码:
x ^= y ^= x ^= y;


保证这两个数是int且没有超界,发现在x和y是两个单独的变量的时候可以,但是如果x和y是一个数组的两个元素的话就会发现这段代码并不能交换这两个元素的值。比如说:

代码:
a[1] ^= a[0] ^= a[1] ^= a[0];


编译命令:

代码:
gcc a.c -o a


生成的汇编代码也很诡异,因为才学汇编也不知道怎么搞的,生成命令:

代码:
gcc a.c -o a.s -S


代码是:

代码:
   .file   "a.c"
   .text
.globl main
   .type   main, @function
main:
   pushl   %ebp
   movl   %esp, %ebp
   pushl   %ebx
   subl   $16, %esp
   movl   $0, -12(%ebp)
   movl   $1, -8(%ebp)
   movl   -12(%ebp), %edx
   movl   -8(%ebp), %ecx
   movl   -12(%ebp), %ebx
   movl   -8(%ebp), %eax
   xorl   %ebx, %eax
   movl   %eax, -12(%ebp)
   movl   -12(%ebp), %eax
   xorl   %ecx, %eax
   movl   %eax, -8(%ebp)
   movl   -8(%ebp), %eax
   xorl   %edx, %eax
   movl   %eax, -12(%ebp)
   addl   $16, %esp
   popl   %ebx
   popl   %ebp
   ret
   .size   main, .-main
   .ident   "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
   .section   .note.GNU-stack,"",@progbits


但是把代码放在vs2008里面编译又能够交换,所以我就郁闷了……

麻烦大牛帮我解答,谢谢啦 :em06

下面附上有问题的源代码,才开始学着用doxygen注释,问题在里面惟一一段用//注释的代码里……


附件:
文件注释: 问题代码在102行//注释的地方
ex3.cpp [8.89 KiB]
被下载 4 次
页首
 用户资料  
 
2 楼 
 文章标题 : Re: 【求助】Ubuntu10.04下gcc编译的一个诡异的问题……
帖子发表于 : 2010-06-13 12:05 

注册: 2009-01-07 15:19
帖子: 153
送出感谢: 1
接收感谢: 0 次
我的代吗

代码:
#include <iostream>

using namespace std;

void swap_int( int &a, int &b)
{
   a ^= b;
   b ^= a;
   a ^= b;
//   a ^= b^= a^= b;
}

int main()
{
   int x, y;
   x = 5;
   y = 6;

   int a[2];
   a[0] = 5;
   a[1] = 6;

   swap_int( x, y);
   swap_int( a[0], a[1]);

   cout << x << " " << y << endl;
   cout << a[0] <<  " " << a[1] << endl;

   return 0;
}


如果使用楼主的代码(即被注释的一段),得到
代码:
0 5
0 5


如果采用上面列的代码,得到

代码:
6 5
6 5


求解释 :em11


_________________
大家好,我是计算机系大学生,玩电脑也 7.8 年了吧,可是这个系统为什么XXX,就不能XXX,连我这种XXX都XXX,怎么能够推广,看来XXX路还很长XXX,搞不懂你们这些XXX,再见了XXX


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 【求助】Ubuntu10.04下gcc编译的一个诡异的问题……
帖子发表于 : 2010-06-13 12:10 

注册: 2010-03-31 14:02
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
afphoenix 写道:
我的代吗

代码:
#include <iostream>

using namespace std;

void swap_int( int &a, int &b)
{
   a ^= b;
   b ^= a;
   a ^= b;
//   a ^= b^= a^= b;
}

int main()
{
   int x, y;
   x = 5;
   y = 6;

   int a[2];
   a[0] = 5;
   a[1] = 6;

   swap_int( x, y);
   swap_int( a[0], a[1]);

   cout << x << " " << y << endl;
   cout << a[0] <<  " " << a[1] << endl;

   return 0;
}


如果使用楼主的代码(即被注释的一段),得到
代码:
0 5
0 5


如果采用上面列的代码,得到

代码:
6 5
6 5


求解释 :em11


如果不把交换过程写成函数呢?我就是直接写在main里面的……


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 【求助】Ubuntu10.04下gcc编译的一个诡异的问题……
帖子发表于 : 2010-06-13 12:21 

注册: 2010-03-31 14:02
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
代码:
代码:
#include <iostream>

using namespace std;

void swap(int &x, int &y)
{
    x ^= y ^= x ^= y;
}

int main()
{
    int a[2] = {0, 1};

    swap(a[0], a[1]);

    cout << a[0] << endl << a[1];
}


结果:
代码:
0
0


另附makeprg和运行命令:

代码:
  set makeprg=g++\ %\ -o\ %<
  :!./%<


突然发现二楼的代码在我这里就是运行不出来,连x和y的交换都不对,诡异了……


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

当前时区为 UTC + 8 小时


在线用户

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


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

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

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