高手请进,一个C语言编译的问题(关于位异或)

2024-11-29 19:31:11
推荐回答(1个)
回答(1):

所谓编译,包括:
C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件
其中,你所说的变量数据类型检查,是在“编译程序本身”这个阶段进行的,
而if条件怎样,是否有执行不到的代码,这些检查是在“优化程序”阶段进行的。
因此,这种非法类型使用将在“编译程序本身”阶段报错。还没有到达判断if条件是否被执行的阶段。
再者,这个功能可以用C模拟一下:
#include
"stdio.h"
void
swapDouble(void
*fx,void
*fy)
{
*(double*)fx+=*(double*)fy,*(double*)fy=*(double*)fx-*(double*)fy,*(double*)fx-=*(double*)fy;
}
void
swapIntOrChar(void
*ix,void
*iy)
{
*(int*)ix^=*(int*)iy,*(int*)iy^=*(int*)ix,*(int*)ix^=*(int*)iy;
}
void
main()
{
double
x=97,y=98;
//int
x=97,y=98;
//char
x=97,y=98;
if(sizeof(x)==8)
{
swapDouble(&x,&y);
printf("%lf,%lf",(double)x,(double)y);
}
else
if(sizeof(x)==4||sizeof(x)==2)
{
swapIntOrChar(&x,&y);
printf("%d,%d",(int)x,(int)y);
}
else
if(sizeof(x)==1)
{
swapIntOrChar(&x,&y);
printf("%c,%c",(char)x,(char)y);
}
}
再或者,你想实现的这种功能,利用C++的重载机制可以很方便的完成。
(学C主要也是为C++打基础,当然如果只搞单片机那种的话,那就精研C吧……)
譬如:
#include
void
swap(float
&x,float
&y)
{
x=x+y,y=x-y,x=x-y;
}
void
swap(int
&x,int
&y)
{
x^=y,y^=x,x^=y;
}
void
main()
{
double
x=1.2,y=2.4;
//int
x=1,y=2;
swap(x,y);
std::cout<}