【发布时间】:2016-02-28 23:33:40
【问题描述】:
代码如下:
#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.u^=b.u^=a.u^=b.u; 语句应该交换了 a 和 b if a>b,但似乎无论我输入什么,输出始终是我的输入。
【问题讨论】:
-
我只想说,如果可读性和可维护性对您有任何价值,您应该找到一种更简单的方法来完成这项任务。不是我知道的答案,但是...
-
想想工会是如何运作的,并考虑 sizeof(a.u) 与 sizeof(a.d)。
-
我认为(但我不确定)写入
a.d然后从a.u读取是未定义的行为。你有优化吗? -
@keithmo 我明白了,谢谢!
-
@immibis 我不确定。作为一个新手程序员,我只需打开 code::blocks,输入我的代码,然后按 F9。关于编译器我什么都没碰。
标签: c unions bit-fields