STK0210
C语言笔记
    1. 因为默认main为int所以可以直接:
  • main(){
  • 函数定义不可嵌套
  • 运算符%%只能用于整数操作
  • %%要双标记才能打印
  • 判等与赋值一定要区分
  • 不可以在同一个地方,访问和修改同一个数的数值
  • 负数操作运算符“/”、“%”时,C89和C99都要确保一个神奇的公式:(a/b)*b+a%d=a
  • 变量是左值
  • if(表达式){语句;}
  • if(表达式){语句;}else语句
  • if的用法:
    • if(表达式){语句;}
    • else if(表达式){语句;}
    • else if(表达式){语句;}
    • else{语句;}
  • 条件表达式:
    • 表达式1?表达式2:表达式3
    • 表达式1成立计算表达式2的值
    • 表达式1不成立计算表达式3的值
  • switch结构:
    • switch(表达式){
    • case 表达式1: case 2: case 3:
      • 语句;break;
    • case 表达式4:
      • 语句;break;
    • default:语句;break;
  • else语句属于离他最近的且还未与其他else配对的if语句
  • 循环中
    1. while用于循环体执行之前检验
    2. do用于循环执行之后检
    3. for用于递增或递减计数变量的循环
    4. continue语句仅在循环可用
  • while循环:
    1. while(表达式)表达式不为0即执行
    2. {语句;}
    3. 如果一来就为0,会一次都不执行直接跳出循环
  • while(1)是一种常用的无限循环语句
  • do循环:
    1. do{语句;}while(表达式);
    2. 先执行循环,再判定
    3. 至少执行一次循环
  • for循环:
    1. for(表达式1;2;3)
    2. 表达式1用来赋初值(循环执行前)
    3. 表达式2用来控制循环终止
    4. 表达式3(循环执行后执行)
    5. 可以等价于
    • 表达式1;
    • while(表达式2){
    • 语句
    • 表达式3;
  • 必须有两个分号,表达式1都可以挑出来表达之后省略(;2;3)
  • 形式参数定义时!每个形参前必须都有其类型说明
  • 函数定义:
    1. 返回类型 函数名(形式参数)
    2. 声明;
    3. 语句;
    4. (花括号内的称为函数体)
  • 函数调用:
    1. 函数名(实际参数);
  • 函数声明:
    1. 返回类型 函数名(形式参数);
    2. 注意!这里有分号!
    3. 原因是形式参数里面没有具体的变量名称,只需要类型
    4. 目的是让程序进行预备
    5. 如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
    6. 如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
  • 无实参的函数要调用也必须有()
  • 非void函数必须用return语句来指定返回值
  • void类型函数没有返回值
  • 若省略返回类型,C89会自动变为int,C99中不合法
  •  把数组名传递给函数时,数组名后不加方括号!
  •  利用数组型实际参数可以控制数组的有效性,把无效部分在后期删去!!!
  •  声明多维数组的形式参数时,声明可以省略第一维的长度(例如二维数组,可以不说行数,但是必须制定列数)
  •  变长数组声明时必须先长度参数,再数组,要让代表数组长度的参数先被程序看见
  •  也可以用*替换数组内的长度参数,*直接代表数组长度与形参列表中的前面的参数有关
  • static可以在数组参数声明中使用C99
  • int a【static 3】代表数组长度至少为3
  • 多维数组的话static仅可用于第一维
  • 静态局部变量static可以在局部变量的值调用结束后,而不释放,保存原值。
    • static int a;
  • 寄存器变量(register变量)代表允许将局部变量的值放在cpu中提高执行效率
    • register int a;
  • 扩展外部变量的作用域(extern)
    1. extern 外部变量名字;
    2. 代表作用域效果从上一行开始
    3. 再正式定义外部变量
    4. 然后以下的范围都可使用
    5. 日后测试完善(少用为好)
    6. 加了static变为静态外部变量后,不可用extern扩大其范围
  • 复合字面量是通过指定其包含的元素而创建的没有名字的数组(int 【】){…}
  • 可以使用const把数组变为只读
    1. (const int【】){1,1}
  • return语句:
    1. return 表达式;
  • 在main函数中也可以用exit来等价替换,形式如下:
    1. 首先必须是在main函数中!
    2. #include<stdlib.h>
    3. exit(表达式);
    4. return 0;可以变为exit(0);
    5. 也可以用exit(EXIT_SUCCESS);
    6. exit(EXIT_FAILURE);
  • continue语句
    1. 把循环转移到循环体末尾之前
    2. 但是没有跳出循环!
  • continue与goto等效替换
    • while (…) {           while (…) {
    •   …                      …
    •   continue;           goto end;
    •   …                      …
    • }                           end: ; 
    •                              }
  • break语句
  • 可以跳出循环
  • 一个break只能跳出最近的一层
  • goto语句
  • 使用模版:
    • 标识符:语句
    • goto 标识符;
  • 可以任意跳跃!直接跳出多重循环!
  • 所以优点也是缺点,很容易创造垃圾代码
  • 空语句最好单独放置在一行,或者用continue;语句或者还可以用{}凸显一下
  • 空循环一般仅只是用于增加简洁度,而不会提高效率
  • 素数判断可以只检查不大于n(你输入的检验数)的平方根 的除数
  • 十进制不可以0开头
  • 八进制通常以0开头
  • 十六进制通常以0x或0X开头
  • 有符号整数类型
    1. short int:%hd
    2. int:%d
    3. long int:%ld(C99可以%lld)
  • 浮点类型
    1. float:%f,常量末尾加f
    2. double:%lf,末尾加F
    3. long double:%lf,末尾加L
    4. 注意!只能在scanf中使用l,不能在printf函数格式串中使用
    5. long double中scanf和printf都放%Lf
  • 字符操作
    1. 显示格式:
    • char sb;
    • sb=\'a\'
    • sb=\'  \'
  • 字符常量使用时,转义序列必须用一对单引号括起来:\'\33\'
  • getchar返回的是int型的值,尽管它读入和返回的是字符
  • %s不能有空格
  • 使用getchar时必须打括号!!!!!曹尼玛!
  • 类型转换有隐式转换和显式转换
  • 常用的算术转换的策略是整值提升
  •  强制转换表达式:
    • (类型名)表达式
  •  类型定义:
    • typedef 类型 名字;
    • 名字 变量,变量,变量;
    • 更容易理解,更有实际意义,容易修改,直接改定义处的类型
    • 类型定义比宏定义强大,宏定义还不能定义数组和指针。
  •   sizeof表达式:
    • sizeof(类型名)
    • 这个运算符允许程序储存指定类型值所需的空间的大小
  •  C语言有两种聚合类型:数组和结构
  •  数组:
    • 类型 名字【大小】{个体表示,个体表示};
  •  数组可以通过在类型名前面加const变成常量数组
  • 声明为常量数组的数组不会被程序修改,编译器也能发现那些有修改他意图的代码
  •  C99可以使用变长数组,即使用非常量表达式
  • 变长数组的限制在于无初始化值和静态存储期限
  •  在局部变量声明中放置static可以使变量具有静态存储期限,即拥有永久的存储单元,即使函数返回,也不会失去他的值。
  • #define N n等效于sizeof(a)/sizeof(a【0】)
  • 这是为了解决可能忘记名字的问题
  • 也可以二者直接组合定义
  •    #include<string.h>
  •  gets(数组) and puts(数组)
  •  strcat(字符数组1,字符数组2)
    • 效果:把字符串2接到1的后面
    • 字符串1一定要够大!
    1.  83.rcpy(字符数组1,字符串2)
      1. 效果:把字符串2复制到字符数组1中
      2. 字符串2也可以是字符数组
      3. 够大!
    2. strcmp(字符串1,字符串2)
      1. 从左往右比较不同元素,随ASCII码大的为正
      1. 若两个字符串相等,为0
      1. 小于为负
    3. strlen(字符数组)
    • 测量长度
    • 不包含\'\0\'
  • strlwr(字符串)
    • 效果:将字符串转化为小写
  • strupr(字符串)
    • 效果:将字符串转化为大写
  • 指针就是地址,指针变量就是储存地址的变量
  • 指针变量的声明:
    • 1.int i;
    • 类型  *p,*q;
    • p=&i;
    • q=&j;
  •   &:取地址符(&x就是x在内存中的地址)*:间接寻址符(*p就是i的别名,改变*p的值也会改变i的值)
  • 对变量使用&会产生指针
  • 对指针使用*会返回变量
  •  q=p是把p的内容(i的地址)给了q,即把q指向了p所指向的地方
  • *q=*p是把p指向的值(i的值)复制给q指向的对象(j的值)
  • const保护参数:说明p是指向“长整数”的指针。表明函数不会改变指针参数指向的对象。
  • 数组指针的元素可以
    • *(p+i)表示数组p的第i个元素
  • p+i实质为p+i*(元素所占字节)还是位置
  • 多维数组中a【1】+1等价于*a(a+1)+1,都表示了a【1】【1】
  • 指向函数的指针:
    • int(*p)(int)
    • p=f(函数入口)
    • 这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
    • 调用形式为:
    • a=(*p)(n)
    • (*p)(n)等效于f(n)
    C语言笔记
      1. 因为默认main为int所以可以直接:
    • main(){
  • 函数定义不可嵌套
  • 运算符%%只能用于整数操作
  • %%要双标记才能打印
  • 判等与赋值一定要区分
  • 不可以在同一个地方,访问和修改同一个数的数值
  • 负数操作运算符“/”、“%”时,C89和C99都要确保一个神奇的公式:(a/b)*b+a%d=a
  • 变量是左值
  • if(表达式){语句;}
  • if(表达式){语句;}else语句
  • if的用法:
    • if(表达式){语句;}
    • else if(表达式){语句;}
    • else if(表达式){语句;}
    • else{语句;}
  • 条件表达式:
    • 表达式1?表达式2:表达式3
    • 表达式1成立计算表达式2的值
    • 表达式1不成立计算表达式3的值
  • switch结构:
    • switch(表达式){
    • case 表达式1: case 2: case 3:
      • 语句;break;
    • case 表达式4:
      • 语句;break;
    • default:语句;break;
  • else语句属于离他最近的且还未与其他else配对的if语句
  • 循环中
    1. while用于循环体执行之前检验
    2. do用于循环执行之后检
    3. for用于递增或递减计数变量的循环
    4. continue语句仅在循环可用
  • while循环:
    1. while(表达式)表达式不为0即执行
    2. {语句;}
    3. 如果一来就为0,会一次都不执行直接跳出循环
  • while(1)是一种常用的无限循环语句
  • do循环:
    1. do{语句;}while(表达式);
    2. 先执行循环,再判定
    3. 至少执行一次循环
  • for循环:
    1. for(表达式1;2;3)
    2. 表达式1用来赋初值(循环执行前)
    3. 表达式2用来控制循环终止
    4. 表达式3(循环执行后执行)
    5. 可以等价于
    • 表达式1;
    • while(表达式2){
    • 语句
    • 表达式3;
  • 必须有两个分号,表达式1都可以挑出来表达之后省略(;2;3)
  • 形式参数定义时!每个形参前必须都有其类型说明
  • 函数定义:
    1. 返回类型 函数名(形式参数)
    2. 声明;
    3. 语句;
    4. (花括号内的称为函数体)
  • 函数调用:
    1. 函数名(实际参数);
  • 函数声明:
    1. 返回类型 函数名(形式参数);
    2. 注意!这里有分号!
    3. 原因是形式参数里面没有具体的变量名称,只需要类型
    4. 目的是让程序进行预备
    5. 如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
    6. 如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
  • 无实参的函数要调用也必须有()
  • 非void函数必须用return语句来指定返回值
  • void类型函数没有返回值
  • 若省略返回类型,C89会自动变为int,C99中不合法
  •  把数组名传递给函数时,数组名后不加方括号!
  •  利用数组型实际参数可以控制数组的有效性,把无效部分在后期删去!!!
  •  声明多维数组的形式参数时,声明可以省略第一维的长度(例如二维数组,可以不说行数,但是必须制定列数)
  •  变长数组声明时必须先长度参数,再数组,要让代表数组长度的参数先被程序看见
  •  也可以用*替换数组内的长度参数,*直接代表数组长度与形参列表中的前面的参数有关
  • static可以在数组参数声明中使用C99
  • int a【static 3】代表数组长度至少为3
  • 多维数组的话static仅可用于第一维
  • 静态局部变量static可以在局部变量的值调用结束后,而不释放,保存原值。
    • static int a;
  • 寄存器变量(register变量)代表允许将局部变量的值放在cpu中提高执行效率
    • register int a;
  • 扩展外部变量的作用域(extern)
    1. extern 外部变量名字;
    2. 代表作用域效果从上一行开始
    3. 再正式定义外部变量
    4. 然后以下的范围都可使用
    5. 日后测试完善(少用为好)
    6. 加了static变为静态外部变量后,不可用extern扩大其范围
  • 复合字面量是通过指定其包含的元素而创建的没有名字的数组(int 【】){…}
  • 可以使用const把数组变为只读
    1. (const int【】){1,1}
  • return语句:
    1. return 表达式;
  • 在main函数中也可以用exit来等价替换,形式如下:
    1. 首先必须是在main函数中!
    2. #include<stdlib.h>
    3. exit(表达式);
    4. return 0;可以变为exit(0);
    5. 也可以用exit(EXIT_SUCCESS);
    6. exit(EXIT_FAILURE);
  • continue语句
    1. 把循环转移到循环体末尾之前
    2. 但是没有跳出循环!
  • continue与goto等效替换
    • while (…) {           while (…) {
    •   …                      …
    •   continue;           goto end;
    •   …                      …
    • }                           end: ; 
    •                              }
  • break语句
  • 可以跳出循环
  • 一个break只能跳出最近的一层
  • goto语句
  • 使用模版:
    • 标识符:语句
    • goto 标识符;
  • 可以任意跳跃!直接跳出多重循环!
  • 所以优点也是缺点,很容易创造垃圾代码
  • 空语句最好单独放置在一行,或者用continue;语句或者还可以用{}凸显一下
  • 空循环一般仅只是用于增加简洁度,而不会提高效率
  • 素数判断可以只检查不大于n(你输入的检验数)的平方根 的除数
  • 十进制不可以0开头
  • 八进制通常以0开头
  • 十六进制通常以0x或0X开头
  • 有符号整数类型
    1. short int:%hd
    2. int:%d
    3. long int:%ld(C99可以%lld)
  • 浮点类型
    1. float:%f,常量末尾加f
    2. double:%lf,末尾加F
    3. long double:%lf,末尾加L
    4. 注意!只能在scanf中使用l,不能在printf函数格式串中使用
    5. long double中scanf和printf都放%Lf
  • 字符操作
    1. 显示格式:
    • char sb;
    • sb=\'a\'
    • sb=\'  \'
  • 字符常量使用时,转义序列必须用一对单引号括起来:\'\33\'
  • getchar返回的是int型的值,尽管它读入和返回的是字符
  • %s不能有空格
  • 使用getchar时必须打括号!!!!!曹尼玛!
  • 类型转换有隐式转换和显式转换
  • 常用的算术转换的策略是整值提升
  •  强制转换表达式:
    • (类型名)表达式
  •  类型定义:
    • typedef 类型 名字;
    • 名字 变量,变量,变量;
    • 更容易理解,更有实际意义,容易修改,直接改定义处的类型
    • 类型定义比宏定义强大,宏定义还不能定义数组和指针。
  •   sizeof表达式:
    • sizeof(类型名)
    • 这个运算符允许程序储存指定类型值所需的空间的大小
  •  C语言有两种聚合类型:数组和结构
  •  数组:
    • 类型 名字【大小】{个体表示,个体表示};
  •  数组可以通过在类型名前面加const变成常量数组
  • 声明为常量数组的数组不会被程序修改,编译器也能发现那些有修改他意图的代码
  •  C99可以使用变长数组,即使用非常量表达式
  • 变长数组的限制在于无初始化值和静态存储期限
  •  在局部变量声明中放置static可以使变量具有静态存储期限,即拥有永久的存储单元,即使函数返回,也不会失去他的值。
    1. #define N n等效于sizeof(a)/sizeof(a【0】)
    • 这是为了解决可能忘记名字的问题
    • 也可以二者直接组合定义
    1.  #include<string.h>
    2.  gets(数组) and puts(数组)
    3.  strcat(字符数组1,字符数组2)
    • 效果:把字符串2接到1的后面
    • 字符串1一定要够大!
  •  strcpy(字符数组1,字符串2)
    • 效果:把字符串2复制到字符数组1中
    • 字符串2也可以是字符数组
    • 够大!
  • strcmp(字符串1,字符串2)
    • 从左往右比较不同元素,随ASCII码大的为正
    • 若两个字符串相等,为0
    • 小于为负
  • strlen(字符数组)
    • 测量长度
    • 不包含\'\0\'
  • strlwr(字符串)
    • 效果:将字符串转化为小写
  • strupr(字符串)
    • 效果:将字符串转化为大写
  • 指针就是地址,指针变量就是储存地址的变量
  • 指针变量的声明:
    • 1.int i;
    • 类型  *p,*q;
    • p=&i;
    • q=&j;
  •   &:取地址符(&x就是x在内存中的地址)*:间接寻址符(*p就是i的别名,改变*p的值也会改变i的值)
  • 对变量使用&会产生指针
  • 对指针使用*会返回变量
  •  q=p是把p的内容(i的地址)给了q,即把q指向了p所指向的地方
  • *q=*p是把p指向的值(i的值)复制给q指向的对象(j的值)
  • const保护参数:说明p是指向“长整数”的指针。表明函数不会改变指针参数指向的对象。
  • 数组指针的元素可以
    • *(p+i)表示数组p的第i个元素
  • p+i实质为p+i*(元素所占字节)还是位置
  • 多维数组中a【1】+1等价于*a(a+1)+1,都表示了a【1】【1】
  • 指向函数的指针:
    • int(*p)(int)
    • p=f(函数入口)
    • 这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
    • 调用形式为:
    • a=(*p)(n)
    • (*p)(n)等效于f(n)
     
    一种单项链表编法
    1. 辗转相除法
      1. 用(a,b)表示最大公约数
      2. 若a%b=c,则(a,b)=(b,c)
    2. 一些常用的函数
      1. 除法:sqrt
      2. pow(x,y)      x的y次方
      3. 字符串拼接:strcat(数组1,数组2)
      4. 字符串比较:strcmp
      5. 字符串复制:strcpy
      6.  

    分类:

    技术点:

    相关文章: