当前位置 博文首页 > 空手道丶大师兄的博客:C笔记

    空手道丶大师兄的博客:C笔记

    作者:[db:作者] 时间:2021-07-18 22:22

    标识符 做题时候注意 for if 之类条件语句有没有加括号 她们作用的范围!!!!!

    定义变量时,我们使用了诸如 a、abc、mn123 这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符(Identifier)

    标识符就是程序员自己起的名字,除了变量名,后面还会讲到函数名、宏名、结构体名等,它们都是标识符。不过,名字也不能随便起,要遵守规范;C语言规定,标识符只能由字母(A~Z, az)、数字(09)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。

    以下是合法的标识符:

    a, x, x3, BOOK_1, sum5

    以下是非法的标识符:

    • 3s 不能以数字开头
    • s+T 出现非法字符+
    • -3x 不能以减号(-)开头
    • bowy-1 出现非法字符减号(-)
    C文件

    源程序 xxx.c 编译之后=> 目标程序 xxx.obj 连接之后=> 可执行程序=> xxx.exe

    #define
    #define FB(a,b) (a*b+1)
    int k=3;
    k=FB(FB(k,k+1),k)-7;
    

    FB(k, k+1) => 3x3+1+1=11 FB(11, 3) => 11x3+1=34 34-7=27

    #include<stdio.h>
    #define PI 3.14
    #define S(r) PI*r*r
    int main(void)
    {
        printf("area = %f", S(1+2));
        rerturn 0;
    }
    

    结果:
    3.14x1+2x1+2 = 3.14+2+2 = 7.14

    #define N 1+2 
    float a = N/2.0;
    /*
    按照常规做法,可能会认为结果是3/2 = 1.5
    但是实际上,结果应该为1+2/2.0 = 2.0
    	
    若想要实现3/2,则#define N (1+2)
    即为避免边缘效应,一定要加!括!号!
    */
    
    字符、字符串
    char i = ‘x’ ;
    char i [4]=”xxxx”;
    printf (%c”, x);对单个字符进行输出
    printf(“%s”, x);对字符串进行输出
    
    string.h头文件的使用

    定义方法:#include <string.h>

    常用的几个函数及功能:

    strchr() 查找字符
    stremp() 比较字符串
    strstr() 在字符串中查找字符串 ,使用方法:strstr(“被查找字符串”, “需要查找的字符串”);
    strcpy() 复制字符串
    strlen() 返回字符串的长度
    strcat() 连接字符串
    strdup() 复制字符串到堆上
    strcmp() 用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str <str2 ,则返回负数;若str1>str2,则返回正数

    atoi 函数(在<stdlib.h>库文件中),是把字符串转换成整型数的一个函数

    sizeof()
    struct student{
      int num;    
      char name[30];
      float score;
    }stud1;
    
    

    sizeof(stud1)的值 = 36

    表达式sizeof(“hello”)的值是______。 6

    同理

    sizeof("\nsum=%d\n")

    结果是9 \n 换行符算一个 一个8个字符 最后加个 \0.

    void main(){
        int a = 10;
    	char b = 'b';
    	short c = 2;
    	long d = 9;
    	float e = 6.29f;
    	double f = 95.0629;
    	int arr[] = { 1,2,3 };
    	char str[] = "hello";  //'\0'也被算进去
    	double *p=&f;
    	int *i=&a;
    	//分别对各个变量使用sizeof运算
    	printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,arr=%d,str=%d point_p=%d,point_i=%d\n",
    		sizeof(a), sizeof(b), sizeof(c), sizeof(d), sizeof(e), sizeof(f),
    		sizeof(arr), sizeof(str), sizeof(p), sizeof(i));
     
    	system("pause");
    }
    输出的结果是:a=4,b=1,c=2,d=4,e=4,f=8,arr=12,str=6 point_p=4,point_i=4
    
    

    ######16位编译器

    char :1个字节
    char*(即指针变量): 2个字节
    short int : 2个字节
    int: 2个字节
    unsigned int : 2个字节
    float: 4个字节
    double: 8个字节
    long: 4个字节
    long long: 8个字节
    unsigned long: 4个字节

    ######32位编译器

    char :1个字节
    char*: 4个字节
    short int : 2个字节
    int: 4个字节
    unsigned int : 4个字节
    float: 4个字节
    double: 8个字节
    long: 4个字节
    long long: 8个字节
    unsigned long: 4个字节

    img

    %

    %d有符号整型int输出,%ld长整型输出,

    %o以无符号八进制数形式输出整数,

    %x以无符号十六进制数形式输出整数(0-9 a-f) 0x 代表16进制

    %u以十进制数输出unsigned型int数据(无符号数)。

    %c用来输出一个字符,

    %s用来输出一个字符串,

    %f用来输出实数,以float浮点型小数形式输出,

    %m.nf:输出共占m列,其中有n位小数,若数值宽度小于m左端补空格。

    %e以指数形式输出实数,

    %g根据大小自动选f格式或e格式,且不输出无意义的零。

    %p 指针,也就是指针指向的地址

    指针
    char ss[10]="02468",*s=ss;
    while(*s++)  //while执行完 s指向第二个元素  *++s s指向第三个元素 4 再输出值
    putchar(*++s);   //48
    
    Static
     #include “stdio.h"
      int x;
      void f(int x)
      {static int a=1;
       printf(%d,,a);
       a+=x+2;
    }
    void main()
    {int k;
     for(k=1;k<=3;k++)
      f(k);
    }
    

    输出 1,4,8 , static可以保存 a的值 第二次调用a=4 保留了第一次的值

    运算符优先级

    https://baike.baidu.com/item/运算符优先级/4752611?fr=aladdin

    简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

    int x=3,y=6,z=0;
    while(x++)!=(y-=1))
    {z++;
     if(x<y)break;
    }
    printf(“x=%d,y=%d,z=%d”.x.y.z);
    

    x=4,y=5,z=1

    计算题细节
    1. 读入1个正整数n,计算并输出s的前n项的和。

    s=1-1/2+1/3-1/4+……

    int main()
    { 
      int k,flag,n;
      float s;
      flag=1;s=0;
      scanf("%d",&n);
    for(k=1;k<=n;k++){
      s=s+flag*1./k ;      //这边一点要用1.  或者1.0
      flag=-flag;       
        }
       printf("sum=%f\n",s);
     }
    
    2.移位计算

    M左移三位 n=M<<3;

    同理 右移 >>x x表示位数。左移运算是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。 输入的n如果是10进制 先把n转换成2进制,然后再移位,移位之后值再转换成10进制传给n。

    3. ! 非运算
    int  main()
    { 
       int a=10, b=0;
       printf("%d",!!a);  //1
       printf("%d",!a);  // 0
       printf("%d",!b);  // 1
       printf("%d",!!b);  //0
    }
    
    4. 指针数组
    	char  *st[ ]={"ONE","TWO","FOUR","K"};
    	printf("%s, %c\n", *(st+1)+1, *(*(st+2)+2)-1);   //输出 WO, T
    
    *(st+1)  代表TWO  *(st+1)+1 从TWO的第二个元素全部输出  //
    *(st+2)  是FOUR, *(st+2)+2 是UR *(*(st+2)+2)就是UR中指向第一个的字符 就是U U-1 就是T 
    
    char  *st[ ]={"ONE","TWO","FOUR","K"};
    printf("%s, %c\n", *(st+2), **st+1);  
    

    **st+1 根据运算符优先级 首先 *st 指的是 *st第一个元素 ”ONE“

    **st指的是 ”ONE“ 中的第一个元素 所以是 o, O+1就是P

    5. Switch
    switch(operator){
              case '+': res = op1+op2; break;
              case '-': res = op1-op2; break;
              case '*': res = op1*op2; break;
              case '/': res = op1/op2; break;   
              default: res = 0;    //如果这里的operator不是 + - * / 那么 res都为0
          }
    
    6. 调用函数类型题
    void f(int n)
    {  if(n<3)
         printf("%d", n);
       else{
         f(n/3);   //第一次 相当于 f(5)
         printf("%d", n