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)优先级问题
C语言复习 第一波 进制转换代码C语言复习 第一波 进制转换代码
(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

















相关文章: