【求助】Ubuntu10.04下gcc编译的一个诡异的问题……

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
lukmy
帖子: 6
注册时间: 2010-03-31 14:02

【求助】Ubuntu10.04下gcc编译的一个诡异的问题……

#1

帖子 lukmy » 2010-06-13 11:35

在用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注释,问题在里面惟一一段用//注释的代码里……
附件
ex3.cpp
问题代码在102行//注释的地方
(8.89 KiB) 已下载 14 次
afphoenix
帖子: 153
注册时间: 2009-01-07 15:19

Re: 【求助】Ubuntu10.04下gcc编译的一个诡异的问题……

#2

帖子 afphoenix » 2010-06-13 12:05

我的代吗

代码: 全选

#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
lukmy
帖子: 6
注册时间: 2010-03-31 14:02

Re: 【求助】Ubuntu10.04下gcc编译的一个诡异的问题……

#3

帖子 lukmy » 2010-06-13 12:10

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里面的……
lukmy
帖子: 6
注册时间: 2010-03-31 14:02

Re: 【求助】Ubuntu10.04下gcc编译的一个诡异的问题……

#4

帖子 lukmy » 2010-06-13 12:21

代码:

代码: 全选

#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的交换都不对,诡异了……
回复