在不使用C中的第三个变量的情况下交换两个变量的值?

Try*_*ard 0 c expression operator-precedence sequence-points

我找到了以下代码片段:

#include <stdio.h>

int main(void) {
    int x=10,y=15;
    x=x+y-(y=x);
    printf("x=%d y=%d",x,y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它实际上交换了变量

任何人都可以解释一下代码如何交换变量?

我认为括号将首先执行然后表达式导致

x=x+y-y;
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 6

此算法不起作用,因为它在此行上调用未定义的行为:

x=x+y-(y=x);
    ^  ^
Run Code Online (Sandbox Code Playgroud)

您正在y根据6.5C99标准草案的相应部分在相同的序列点中修改并使用其值:

在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的计算来修改一次.72)此外,先前的值应该是只读的,以确定要存储的值.73)

由于未指定子表达式的评估顺序,因此还存在未指定行为的问题:

运算符和操作数的分组由语法表示.74)除了稍后指定的(对于函数调用(),&&,||,?:和逗号运算符),子表达式的评估顺序和顺序发生哪些副作用都是未指明的.

在这种情况下,如果您使用clang它将提供以下警告:

warning: unsequenced modification and access to 'y' [-Wunsequenced]
x=x+y-(y=x);
    ~   ^
Run Code Online (Sandbox Code Playgroud)

据我所知,默认情况下.您可以gcc通过使用收到类似的警告-Wall.

有几个SO问题涵盖了如何在没有临时交换的情况下进行交换,例如在不使用第三个变量的情况下交换两个变量值.