1、进制问题(各进制之间的转换),注意,牵扯到位运算,都是基于二进制的,最好把位数写全。
%x:十六进制打印 例:0x78
%08x:十六进制八位打印 例:00000078
2、fopen和open的区别:fopen是C库函数中,open是系统调用。
3、处理数字:一般套路是:%n,/=n;
函数:实现十进制向任意进制转换
#include<stdio.h>
#include<string.h>
#define SIZE 128
void reverse(char *arr,int len)//逆置函数
{
for(int i=0,j=len-1;i<len/2;++i,--j)
{
char tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
void itoa(int data,int radix,char *result)//转进制函数
{
int i = 0;
if(data > 0)
{
do
{
int tmp = data % radix;
if(tmp < 10) //小于10就用10表示
{
result[i++] = tmp + '0';
}
else //大于10就用abc字母表示
{
result[i++] = 'a' + (tmp-10);
}
data = data / radix;
}while(data != 0);
int len = strlen(result);
reverse(result,len);
}else
{
return;
}
}
int main()
{
char result[SIZE] = {0};
int data = 0;
int radix = 0;
scanf("%d",&data);
scanf("%d",&radix);
itoa(data,radix,result);
printf("%s\n",result);
return 0;
}
写一个判断是否是小写字母的函数
bool Myislower(char ch)
{
int min = (int)('a');
int max = (int)('z');
if((int)ch>=min &&(int)ch<=max)
return true;
else
return false;
}
int main()
{
printf("%d\n",Myislower('a')); //1
printf("%d\n",Myislower('A')); //0
return 0;
}
4、运算符问题
(1)优先级问题
(2)、浮点数:位运算不适用,求余不适用,比较相等不适用。
(3)、0<a<2 永远为真 因为如果0<a为0为1都小于2
(4)、表达式1&&表达式2 : 1为假不看2
表达式1 || 表达式2:1为真不看2
5、类型转换:原则,窄 =》 宽;(默认相同类型下,无符号更宽)
int main()
{
unsigned short a = 10;
unsigned int b = 10;
if(a > -1)//整型起
{
printf("a>-1\n");
}
printf("a<-1\n");
if(b > -1)
{
printf("b>-1\n");
}
printf("b<-1\n");
return 0;
}
//结果:a>-1(10转成int,还是10,然后大于-1)
b<-1(-1转成int是好大的数字,所以肯定大于10)
int main()
{
char a = 100;
char b = -1;
char c = 200;
unsigned char d = 10;
unsigned char e = -1;
unsigned char f = 200;
int g = a;
printf("%d,%x\n",g,g);//100 64
g = b;
printf("%d,%x\n",g,g);//-1 ffffffff
g = c;
printf("%d,%x\n",g,g);//-56 ffffffc8 (200的二进制:11001000 因为是负数,所以取反加一)
g = d;
printf("%d,%x\n",g,g);//10 a
g = e;
printf("%d,%x\n",g,g);//255 ff(-1的二进制表示:11111111因为unsigned所以等于255)
g = f;
printf("%d,%x\n",g,g);//200 c8
return 0;
}
类型转换一定要注意,如果是负数,就要取反加一得值。
5、基本语法
(1)、switch:case或者default进,break出
void Show(int a)
{
switch(a)
{
default:
printf("other\n");
case 0:
printf("0\n");
case 4:
printf("4\n");
case 3:
printf("3\n");
break;
case 1:
printf("1\n");
break;
}
}
int main()
{
Show(10);//other 0 4 3
return 0;
}
六、指针和数组
int main()
{//数组名表示整个数组:在定义数组的同一个函数中,sizeof(arr),&arr+1
int arr[10] = {1,2,3,4,5,6,7,8,9};
int *p = arr; //指针-指针
int *q = &arr[8];
printf("%d\n",p-q);//-8
printf("%d\n",q-p);//8
printf("%d\n",(short *)p-(short *)q);//-16 本来是 4*(-8) = -32位 然后short是2个字节 所以距离就是[-32/2=-16]
printf("%d\n",(double *)p-(double *)q);//-4 本来是 4*(-8) = -32位 然后double是8个字节 所以距离就是[-32/8=-4]
printf("%d\n",(unsigned long)q-(unsigned long)p);//32 p里存0号下标地址,q存8号下标地址,他俩差的就是4Byte*8=32
int *p1 = (int *)2000;//指针+-数字
printf("%d\n",p1+2);//2008 2000+2*4
printf("%d\n",(char *)p1+2);//2002 2000+2*1
printf("%d\n",(long long)p1+2);//2002 2000+2
printf("%d\n",(double **)p1+2);//2008 2000+2*4
//int *p = (int *)&arr + 1;//arr[1]
//int *q = (int *)(&arr+1);//arr[10]
//printf("%d,%d\n",p[2],q[-3]);//4,8 *(p+2)
//&arr+1
return 0;
}
总结:关于指针的三个操作,指针+-数字,指针-指针,都要注意要计算指针的权重,即去掉星号求sizeof