#include<stdio.h>
int main(){
int a[2]={8,7};int min,i;
i=0,min=1;
a[min]^=a[i]^=a[min]^=a[i];//交换变量
//a[i]=a[i]^a[min],a[min]=a[i]^a[min],a[i]=a[i]^a[min];
printf("%d %d ",a[i],a[min]);
}
这个代码输出是7,0
交换变量一行换成下一行的注释句运行结果是7,8;
但是这两个不是等价的么,书上说是等价的;
#include<stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
a^=b^=a^=b;
printf("%d %d",a,b);
}
而这里面的交换变量是成功的;
为什么呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
a[min]^=a[i]^=a[min]^=a[i]
这句跟一句话里面使用多个自增一样,是未定义行为。简而言之就是,你在一句代码里面多次访问了a[min],并做出了修改。第二次的访问使用了修改前的值还是修改后的值,不同编译器的实现不一样。