C中是否有内置交换功能?

33 c swap

C中是否有内置交换功能,不使用第三个变量?

Sai*_*aif 28

没有
.C++有,但它的工作方式类似于c = a;a = b; b = c;
C++内置交换功能:swap(first,second);
请查看:http://www.cplusplus.com/reference/algorithm/swap/

您可以使用它来交换两个变量值而不使用第三个变量:

a=a^b;
b=a^b;
a=b^a;
Run Code Online (Sandbox Code Playgroud)

你也可以检查一下:

/sf/ask/52972531/

没有第三个变量如何交换?

  • 应该避免总和与差的解决方案。使用带符号类型的操作数,它可能会溢出,并且在C中未定义带符号的溢出。 (2认同)

Pet*_*der 24

为什么你不想使用第三个变量?这是绝大多数架构上最快的方式.

XOR交换算法工程没有第三个变量,但它是在两个方面问题:

  1. 变量必须是不同的,即swap(&a, &a)不起作用.
  2. 一般来说它比较慢.

如果使用第三个变量会导致堆栈溢出,有时可能最好使用XOR交换,但通常您不能进行该调用.

要直接回答你的问题,标准C中没有交换功能,尽管编写起来很简单.

  • @delnan:`int t = a; a = b; b = t;`vs`a ^ = b; b ^ = a; a ^ = b;`.浪费时间在哪里?宇宙正在写一个交换,这对你解决问题所花费的时间有很大贡献吗?这一定是我见过的最大的非问题. (9认同)

Igo*_*Oks 8

标准C中没有这样的功能.

(在C++中你有std::swap().)


也许这个问题的宏可能对你有用.


Bas*_*tch 8

假设你想要一个C solotion,而不是一个C++,你可以把它变成一个宏,至少使用GCC扩展来使它足够通用,类似于

 #define SWAP(x,y) do {   \ 
   typeof(x) _x = x;      \
   typeof(y) _y = y;      \
   x = _y;                \
   y = _x;                \
 } while(0)
Run Code Online (Sandbox Code Playgroud)

提防像调用这样的技巧swap(t[i++],i); 要避免它们,请使用地址运算符&.而且你最好使用一个临时的(对于整数,有一个着名的,无用的技巧,独家或).

PS:我使用的两个局部变量_x_y(但我可能只是一个局部变量使用)为更好的可读性,或许也使从编译器更多的优化.

  • 使用两个临时变量而不是一个(比如说,`typeof(x) _tmp = x; x = y; y = _tmp;`)有什么好处? (2认同)

oua*_*uah 6

C中没有标准函数来交换两个变量.

宏可以这样写:

#define SWAP(T, a, b) do { T tmp = a; a = b; b = tmp; } while (0)
Run Code Online (Sandbox Code Playgroud)

并且宏可以这样调用:

int a = 42;
int b = 2718;

SWAP(int, a, b);
Run Code Online (Sandbox Code Playgroud)

应该避免编写SWAP宏的一些解决方案:

#define SWAP(a, b) do { a = b + a; b = a - b; a = a - b; } while (0)
Run Code Online (Sandbox Code Playgroud)

当操作数是有符号类型时,可能发生溢出,有符号溢出是未定义的行为.

此外,应该避免尝试优化此类XOR解决方案的解决方案:

#define SWAP(a, b) (a ^= b ^= a ^=b)
Run Code Online (Sandbox Code Playgroud)

a 在前一个和下一个序列点之间被修改两次,因此它违反了序列点规则并且是未定义的行为.