我想使用没有任何函数调用的指针或任何临时变量交换两个变量。
我目前的代码是:
void main()
{
int a=1, b=2, *c;
cout << a << b << endl;
*c = a;
a = b;
b = *c;
cout << a << b << endl;
getch();
}
代码适用于Turbo C ++但不适用于Visual Studio,而且我认为使用未初始化的指针变量是不好的做法。
那么有人能告诉我在这段代码中我需要做些什么改变才能在visual studio上工作?如果有更好的方法请告诉。
谢谢..
答案 0 :(得分:2)
在设置某个值之前,您无法使用c
的值。所以*c = a;
是胡说八道。您必须先c = <something>
。
答案 1 :(得分:0)
您可以使用所谓的XOR交换,请参阅此链接http://en.wikipedia.org/wiki/XOR_swap_algorithm
if(&a != &b) // test that the 2 variables don't have the same address (in this case you get a=b=0)
{
a = a^b;
b = a^b;
a = a^b;
}
使用指针(来自维基百科)
void xorSwap (int *x, int *y)
{
if (x != y)
{
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
}
还有其他方法可以在没有临时值的情况下执行此操作,例如加/减法
a = a + b;
b = a - b;
a = a - b;
但是你应该总是依靠编译器来为你做优化,即使用temp而不用担心它。
答案 2 :(得分:0)
以下是psuedo-assembly语言中的一些特定于平台的方法:
Push&amp;弹出强>
许多处理器都有指令将值压入堆栈并加载它
这与使用临时变量的方法基本相同。
push register 0
push register 1
pop register 0
pop register 1
交换指示
某些处理器具有交换(例如xchg),允许您交换(交换)两个寄存器。某些处理器可能允许您将寄存器与存储位置进行交换
xchg R0,R1;将寄存器0与寄存器1交换。
<强>摘要强>
一些处理器具有推入堆栈并从堆栈弹出的能力。这可用于交换寄存器中的值。另一种与处理器相关的交换方法是使用处理器&#34;交换&#34;或&#34;交换&#34;指令。并非所有处理器都有这些指令,因此这些技术不可移植。