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

来自:    更新日期:早些时候
C语言编译题。。高手请进。在线等。。急~!~

写太快了 漏了一句 呵呵
/*最大公约数*/
if(m<n)
{
if(n%m==0) s1=m; //整除
else
{ for(i=m/2;i>=1;i--) { if(n%i==0&&m%i==0) {s1=i;break;} } }
}
else //m>=n时
{
if(m%n==0) s1=n;
else
{ for(i=n/2;i>=1;i--){if(m%i==0&&n%i==0) {s1=i;break;} } }
}
/*最小公倍数*/
s2=s1*(n/s1)*(m/s1);

printf("1
1 1
");
你这只是输出并没有把他写入a[][]中
应该这样;
a[0][0]=1;
a[1][0]=1;a[1][1]=1;
然后再a[i][j]=a[i-1][j]+a[i-1][j-1
这样的话这两个a[i-1][j]+a[i-1][j-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<iostream>
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<<x<<","<<y;
}

float x,y; 浮点数不能进行位运算。
只能整型.

把if 的代码包起来,就好了,下面的代码己是能运行的了。TC 通过正确
#include "stdio.h"
main()
{
int x,y;
x=2,y=4;
if (sizeof(x)<4){
x^=y,y^=x,x^=y;
}/*这句不满足条件,不被执行*/
else{
x=x+y,y=x-y,x=x-y;
}
printf("%d,%d",x,y);

getch();
}

float x,y; 浮点数不能进行位运算。

/*这句不满足条件,不被执行*/ -- 满不满足条件 要 计算sizeof(x)< 4 后才知道,所以编译时 要编译 x^=y,y^=x 。。。的运算。


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

相关评论:

相关主题精彩

版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

Copyright © 喜物网