[英]Can we swap two numbers in C or C++ without passing pointers or references to the swap function?
我在面试中被问过一个或两次这个问题。 我不确定是否可行。 也许C中的结构是出路? 谁能进一步阐述一下?
如果两个值都在结构内部,则可以使用函数的返回值,而不用通过引用传递:
struct twoNumbers {
int first;
int second;
};
struct twoNumbers swapNumbers(struct twoNumbers src)
{
int tmp = src.first;
src.first = src.second;
src.second = tmp;
return src;
}
/* ... */
struct twoNumbers s = { 5, 42 };
s = swapNumbers(s);
...尽管如此,使用指针可能更实用。
除非交换功能实际上是宏,否则是不可能的。 如果您不通过指针或引用传递,那么您将通过值传递,这意味着它将传递一个副本而不是值本身,因此您无法影响调用方范围内的变量,因为值被复制。
您在那里进行的任何交换,即使使用地址也将不会影响调用者范围内的变量状态。
假设您需要一个函数来进行交换,并且该函数不能接受引用或指针,我只能想到一种方法,该方法是完全不可移植的,并且可能无法始终如一地工作:
交换函数必须检查堆栈以找到调用代码的返回地址。 然后,它将不得不向后循环,分解导致调用的代码,确定将参数推入堆栈的指令(或将其放入参数寄存器,具体取决于平台的标准调用约定),并确定内存位置参数是从中加载的。 然后,您可以在那些存储位置执行值的交换。 如果在调用之前未覆盖中间寄存器,则可能还应该修正用于传输值的中间寄存器。
正如我所说,这完全是不可移植的,而且完全容易出错。 但是,如果您足够了解机器的体系结构和标称编译输出以描述您将如何做,那么您可能会给您的面试官留下深刻的印象。
//交换两个数字而不使用函数参数//如果出现任何错误,请纠正我//使用堆栈(堆栈用于存储局部变量)push和pop概念//这里
#include<stdio.h>
void fun_1();
void main()
{
int a,b;
a = 2;
b = 3;
printf("values of a & b before : %d %d ", a, b);
fun_1();
printf("values of a & b after : %d %d ", a, b);
}
void fun_1()
{
int temp, *ptr;
ptr = &temp;
ptr--;
temp = *ptr;
ptr = ptr-1;
ptr--;
*ptr = temp;
}
是的你可以。 这是代码:
int x = 0;
int y = 1;
// Want to swap x and y.
{
int tmp = x;
x = y;
y = tmp;
}
// They have now been swapped. No function calls. No pointers. No references.
是! 小菜一碟!
给出问题陈述原样....可以做到这一点而无需将任何内容传递给swap函数! 它很容易做到:-
int first;
int second;
void swap()
{
int temp = first;
first = second;
second = temp;
}
他们没有说您只能调用一次swap
:
int swap(bool do_swap, int x = 0, int y = 0)
{
static int x_;
static int y_;
if (do_swap) {
x_ = y;
y_ = x;
return x_;
}
return y_;
}
int main()
{
int x = 1;
int y = 42;
x = swap(true, x, y);
y = swap(false);
}
如果需要交换两个int16的解决方案
uint32_t swap16(uint16_t x, uint16_t y)
{
return (x << 16 | y);
}
int main(void)
{
uint16_t x, y;
uint32_t res;
x = 1;
y = 2;
res = swap16(x, y);
x = res & 0xffff;
y = (res >> 16) & 0xffff;
}
您可以使用包含两个数字的结构/类进行交换,但这有点愚蠢。 您可以使用的是一个宏。 (也许是他们想要的答案?)
我不太确定您最初提出的问题,但是您似乎需要以下内容:
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
这是一个古老的琐事问题。 挫折
他们问您是否知道XOR交换技巧。
http://en.wikipedia.org/wiki/XOR_swap_algorithm
对我来说,这也意味着您正在接受已经过时20年或只是被删除的人的面试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.