我尝试使用 ^= 交换值(我知道最好使用另一个变量来执行此操作),
但结果不正确。

#include <stdio.h>

int main() {
    int a = 3, b = 5, *pa = &a, **ppa = &pa, *pb = &b, **ppb = &pb;
    *pa ^= *pb;
    *pb ^= *pa;
    *pa ^= *pb;
    printf("pointer 1: a = %d, b = %d\n", a, b);
    a ^= b ^= a ^= b;
    printf("variables: a = %d, b = %d\n", a, b);
    *pa ^= *pb ^= *pa ^= *pb;
    printf("pointer 2: a = %d, b = %d\n", a, b);
    return 0;
}

结果是
pointer 1: a = 5, b = 3
variables: a = 3, b = 5
pointer 2: a = 0, b = 3

我想知道为什么 *pa ^= *pb ^= *pa ^= *pb 不能正常工作。有谁能告诉我吗?

最佳答案

中的赋值之间没有序列点

*pa ^= *pb ^= *pa ^= *pb;

所以行为没有定义。

中的赋值之间也没有序列点
a ^= b ^= a ^= b;

所以该行的行为也是未定义的。如果那碰巧奏效,那么你是(不)幸运的。

关于c - 使用指针和 "^="交换值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19972154/

10-12 05:30