繁体   English   中英

我们可以在C或C ++中交换两个数字而不传递指向交换函数的指针或引用吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM