C语言
Jackie

程序设计入门——C语言

C语言程序设计进阶


优先级

赋值运算符<条件运算符<关系运算符<算术运算符

优先级 运算符 结合性
1 () 从左到右
2 ! + - ++ – 从右到左
单目的+和-
3 * / % 从左到右
4 + - 从左到右
5 < <= > >= 从左到右
6 == != 从左到右
7 && 从左到右
8 || 从左到右
9 = += -= *= /= %= 从右到左

不要把赋值、包括复合赋值组合进表达式

分支结构

switch-case

switch(表达式){
case 常量:

break;
default:

}
  • break:跳出循环

  • continue:跳过循环这一轮剩下的语句进入下一轮

  • goto:多重循环的内层跳到最外面的时候(但是少用)

	goto out;
···
out:
return 0;

循环

while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。


do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。

布尔运算

#include <stdbool.h>

之后就可以使用bool和true、false

#include <stdbool.h>

bool b=6>5;
bool c=true;
printf("%d\n",b);

数组

int number[100];
int a[]={1,4,5,63,27,8,6,2,9,8,23,7}

数组变量本身表达地址,所以

  • int a[10];int *p=a;//无需用&取地址

但是数组的单元表达的是变量,需要用&取地址

  • a==&a[0]

[]运算符可以对数组做,也可以对指针做:

  • p[0]<==>a[0]

*运算符可以对指针做,也可以对数组做:

  • *a=25;

数组变量是const的指针,不能被赋值

  • int a[]<==>int * const a=
>int i
>const int* p1=&i;
>int const* p2=&i;
>int *const p3=&i;

判断哪个被const了的标志是const在*的前面还是后面

  1. 格式控制符的形式

%、[-]、[0]、[m/m.n]、[l/h]格式控制符

其中[ ]里面的内容是可选的

  • -:表示左对齐,缺省情况下为右对齐(若没规定输出数据的宽度则为左对齐)。

  • 0:当规定输出数据的宽度时,所输出数据实际的宽度小于规定的宽度,则在左边用“0”补齐。

  • m/m.n:m规定了输出数据的宽度(位数),若数据实际的宽度大于m,则突破m的限制全部输出,反之将数据全部输出之后用空格进行左补齐;对于实数n是指小数点后的位数,若n小于小数点后实际的位数,则按四舍五入原则进行截取;对于字符串,n表示从左至右截取的字符个数。

  • l/h:l表示长整型数据(可用于%ld、%lo、%lx、%lu)以及double型数据(%lf或%le);h表示短整型数据(可用于%hd、%ho、%hx)。

  1. 格式控制符及其功能(以输出为例)
  • %d:用来输出有符号的十进制整数(包括char类型)
  • %u:用来输出无符号的十进制整数(包括char类型)
  • %o:用来输出无符号的八进制整数(比如输出*p的值(*p指向a则输出a的地址))
  • %x:用来输出无符号的十六进制整数
  • %c:用来输出单个字符
  • %s:用来输出一个字符串(%和s之间加数字控制只读这么多数字)
  • %f:用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
  • %e:用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
  • %g:用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别)
  • %p:用来输出值的地址

字符串函数

#include <string.h>
  • strlen(字符数组):返回字符串的长度(不包括结尾的\0

  • strcmp(str1,str2):按ASCII码值大小比较两个字符串,出现不相同的字符以第一对不相同的字符比较结果为准并返回:

    • 0:s1==s2
    • 正整数:s1>s2
    • 负整数:s1<s2
  • strcpy(str1,str2):把后者的字符串覆写拷贝到前者

    strncpy(str1,str2,n):将str2的前n个字符复制到str1中。

  • strcat(str1,str2):把后者的字符串拷贝到前者的后面,接成一个长的字符串

  • strchr:在一个字符串中查找给定字符的第一个匹配之处,返回null表示没找到

  • strstr:判断字符串后者是否是前者的子串。如是则返回前者字符串从后者第一次出现的位置开始到结尾,否则返回null

  • strlwr(字符串):将字符串中的大写字母换成小写字母

  • strupr(字符串):将字符串中的小写字母换成大写字母

变量的存储方式和生存期

存储空间分为三部分:

  • 程序区

  • 静态存储区

    • 全局变量
  • 动态存储区

    • 函数形参:在调用函数时给形参分配存储空间
    • 函数中定义的没有用关键字static声明的变量(自动变量)
    • 函数调用时的现场保护和返回地址等

局部变量的存储类别

  1. 自动变量(auto变量)
(auto) int a=0;
  1. 寄存器变量(register变量)(现在用register声明变量的必要性不大)

为提高使用效率将使用频繁的局部变量值放在CPU的寄存器

register int a;
  • 全局变量的存储类别

全局变量的作用域有以下几种情况:

  1. 在一个文件内拓展外部变量的作用域

用extern作外部变量声明,表示该外部变量的作用域拓展到此位置(但是提倡将外部变量的定义放在引用它的所有函数前,可避免在函数中多加一个extern声明)

#include<stdio.h>
int main(){
int max();//因AB是外部变量,所以调用max时用不到参数传递
extern int A,B;
printf("max is %d",max());
}
int A,B;
int max(){
return (A>B?A:B)
}
  1. 将外部变量的作用域拓展到其他文件

  2. 将外部变量的作用域限制在本文件中

某些外部变量只限于被本文件引用,而不能被其他文件引用,这时可在定义外部变量时加一个static声明

动态内存分配

#include <stdlib.h>
  1. malloc(size):在内存的动态存储区中分配一个长度为size字节的连续空间(用完要free)
  2. calloc(n,size):分配n个长度为size的连续空间(保存数组时常用)
  3. realloc(p,size):将p所指向的动态空间大小改为size,p值不变
  4. free(p):释放动态存储区

内部函数&外部函数

  • 内部函数

一个只能被本文件中其他函数所调用的函数,在定义内部函数时在函数名和函数类型前加static

  • 外部函数

可供其他文件调用的函数,在函数首部的最左端加关键字extern(定义函数时省略extern则默认为是外部函数)

指针

int a=1,b=2;
int *p1=&a;
int *p2;
p2=&b;

*(arr+i)和arr[i]无条件等价

实参类型 要求形参的类型 传递的信息 通过函数调用能否改变实参的值
变量名 变量名 变量的值 不能
数组名 数组名或指针变量 实参数组首元素的地址
  • 通过指针引用数组

image

如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的对象。


通过指针引用字符串:

char *str="hello";

指向函数的指针

int (*p)(int);//不可省略*p两边的括号!

指针变量的类型及含义

image

结构体

struct 结构体名{
...
};
struct Example eg1,eg2;

枚举

enum 枚举类型名字{名字0,…,名字n};

声明枚举量也可以指定值

和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符

文件读写

fopen(文件名,使用文件方式);

fopen("a1","r");

使用文件方式

image

常用下面方法打开一个文件

if((fp=open("file1","r"))==NULL){
printf("can't open file\n");
exit(0);
}

fclose关闭数据文件

读写一个字符的函数

image

读写一个字符串的函数

image

易混淆

表达式
a++ a原来的值
++a a+1以后的值
a– a原来的值
–a a-1以后的值

++a:先加再用

a++:先用再加

杂项

  • 随机数的生成
#include <stdlib.h>
#include <time.h>
srand(time(0));
int num=rand();
 评论
评论插件加载失败
正在加载评论插件