gpt4 book ai didi

c - 为什么 a 和 b 在这段代码中没有交换?

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:54 25 4
gpt4 key购买 nike

代码如下:

#include <stdio.h>

union
{
unsigned u;
double d;
} a,b;

int main(void)
{
printf("Enter a, b:");
scanf("%lf %lf",&a.d,&b.d);
if(a.d>b.d)
{
a.u^=b.u^=a.u^=b.u;
}
printf("a=%g, b=%g\n",a.d,b.d);
return 0;
}

如果 a>b,a.u^=b.u^=a.u^=b.u; 语句应该交换 ab ,但似乎无论我输入什么,输出始终都是我的输入。

最佳答案

a.u^=b.u^=a.u^=b.u; 在没有序列点的情况下写入 a.u 两次导致未定义的行为。 See here用于讨论此代码。

你可以这样写:

unsigned tmp;
tmp = a.u;
a.u = b.u;
b.u = tmp;

这将交换 a.ub.u。但是,如果 double 在您的系统上是比 unsigned 更大的类型(常见情况),这可能无法实现交换两个 double 的目标。

关于c - 为什么 a 和 b 在这段代码中没有交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33929022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com