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)
你也可以检查一下:
Pet*_*der 24
为什么你不想使用第三个变量?这是绝大多数架构上最快的方式.
该XOR交换算法工程没有第三个变量,但它是在两个方面问题:
swap(&a, &a)不起作用.如果使用第三个变量会导致堆栈溢出,有时可能最好使用XOR交换,但通常您不能进行该调用.
要直接回答你的问题,标准C中没有交换功能,尽管编写起来很简单.
假设你想要一个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(但我可能只是一个局部变量使用)为更好的可读性,或许也使从编译器更多的优化.
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 在前一个和下一个序列点之间被修改两次,因此它违反了序列点规则并且是未定义的行为.