我试图编写一个交换函数,而不使用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/

10-14 08:21