在 C 中,当有变量(假设两者都为int
)i
小于j
时,我们可以使用等式
i^=j^=i^=j
交换两个变量的值。例如,让int i = 3
, j = 5
; 计算后i^=j^=i^=j
,我有i = 5
, j = 3
。
但是,如果我使用两个 int 指针重新执行此操作,*i^=*j^=*i^=*j
使用上面的示例,我所拥有的将是i = 0
and j = 3
。
在 C 中
1
int i=3, j=5;
i^=j^=i^=j; // after this i = 5, j=3
2
int i = 3, j= 5;
int *pi = &i, *pj = &j;
*pi^=*pj^=*pi^=*pj; // after this, $pi = 0, *pj = 5
在 JavaScript 中
var i=3, j=5;
i^=j^=i^=j; // after this, i = 0, j= 3
JavaScript 中的结果让我更感兴趣
我的示例代码,在 ubuntu 服务器 11.0 和 gcc 上
#include <stdio.h>
int main(){
int i=7, j=9;
int *pi=&i, *pj=&j;
i^=j^=i^=j;
printf("i=%d j=%d\n", i, j);
i=7, j=9;
*pi^=*pj^=*pi^=*pj
printf("i=%d j=%d\n", *pi, *pj);
}
c中未定义的行为
c 中未定义的行为会是导致这个问题的真正原因吗?
1
在 Windows 7 上使用 Visual Studio 2005 编译的代码会产生预期的结果(输出 i = 7,j = 9 两次。)
2
在 ubuntu ( gcc test.c ) 上使用 gcc 编译的代码会产生意想不到的结果 ( Output i = 7, j = 9 then i = 0, j = 9 )
3
在 ubuntu 上使用 gcc 编译的代码(gcc -O test.c)产生预期的结果(输出 i = 7,j = 9 两次。)