我试图编写一个交换函数,而不使用C中的tmp,下面是我使用的:
void swap(int *a, int* b) {
*a += *b;
*b = *a - *b;
*a -= *b;
}
现在有一个问题(或者我是这么想的)是,如果
*a + * b > INT_MAX
,我们可能会溢出令人困惑的是,它实际上工作得很好,即使是在边缘的情况下有人能解释为什么吗??下面是我使用的一些测试用例:
int main() {
int t1Swap[] = {INT_MAX, 1};
int t2Swap[] = {INT_MAX, INT_MIN};
int t3Swap[] = {INT_MAX, INT_MAX-1000};
int t4Swap[] = {INT_MIN, INT_MIN+1000};
}
提前谢谢!
最佳答案
有符号整数溢出是未定义的行为,因此它可能工作,也可能不工作,具体取决于您的特定系统和编译器要避免这种未定义的行为,请使用逐位异或运算符而不是加减来交换变量,而不引入temp
:
a=a^b;
b=a^b;
a=a^b;
关于c - 交换两个整数而不会产生第三次溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54242307/