优先级
赋值运算符<条件运算符<关系运算符<算术运算符
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () | 从左到右 |
2 | ! + - ++ – | 从右到左 单目的+和- |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | < <= > >= | 从左到右 |
6 | == != | 从左到右 |
7 | && | 从左到右 |
8 | || | 从左到右 |
9 | = += -= *= /= %= | 从右到左 |
不要把赋值、包括复合赋值组合进表达式
分支结构
switch-case
switch(表达式){ |
-
break:跳出循环
-
continue:跳过循环这一轮剩下的语句进入下一轮
-
goto:多重循环的内层跳到最外面的时候(但是少用)
goto out; |
循环
while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
布尔运算
之后就可以使用bool和true、false
|
数组
int number[100]; |
数组变量本身表达地址,所以
- 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在*的前面还是后面
- 格式控制符的形式
%、[-]、[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)。
- 格式控制符及其功能(以输出为例)
- %d:用来输出有符号的十进制整数(包括char类型)
- %u:用来输出无符号的十进制整数(包括char类型)
- %o:用来输出无符号的八进制整数(比如输出*p的值(*p指向a则输出a的地址))
- %x:用来输出无符号的十六进制整数
- %c:用来输出单个字符
- %s:用来输出一个字符串(%和s之间加数字控制只读这么多数字)
- %f:用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
- %e:用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
- %g:用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别)
- %p:用来输出值的地址
字符串函数
-
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声明的变量(自动变量)
- 函数调用时的现场保护和返回地址等
局部变量的存储类别
- 自动变量(auto变量)
(auto) int a=0; |
- 寄存器变量(register变量)(现在用register声明变量的必要性不大)
为提高使用效率将使用频繁的局部变量值放在CPU的寄存器中
register int a; |
- 全局变量的存储类别
全局变量的作用域有以下几种情况:
- 在一个文件内拓展外部变量的作用域
用extern作外部变量声明,表示该外部变量的作用域拓展到此位置(但是提倡将外部变量的定义放在引用它的所有函数前,可避免在函数中多加一个extern声明)
|
-
将外部变量的作用域拓展到其他文件
-
将外部变量的作用域限制在本文件中
某些外部变量只限于被本文件引用,而不能被其他文件引用,这时可在定义外部变量时加一个static声明
动态内存分配
- malloc(size):在内存的动态存储区中分配一个长度为size字节的连续空间(用完要free)
- calloc(n,size):分配n个长度为size的连续空间(保存数组时常用)
- realloc(p,size):将p所指向的动态空间大小改为size,p值不变
- free(p):释放动态存储区
内部函数&外部函数
- 内部函数
一个只能被本文件中其他函数所调用的函数,在定义内部函数时在函数名和函数类型前加static
- 外部函数
可供其他文件调用的函数,在函数首部的最左端加关键字extern(定义函数时省略extern则默认为是外部函数)
指针
int a=1,b=2; |
*(arr+i)和arr[i]无条件等价
实参类型 | 要求形参的类型 | 传递的信息 | 通过函数调用能否改变实参的值 |
---|---|---|---|
变量名 | 变量名 | 变量的值 | 不能 |
数组名 | 数组名或指针变量 | 实参数组首元素的地址 | 能 |
- 通过指针引用数组
如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的对象。
通过指针引用字符串:
char *str="hello"; |
指向函数的指针
int (*p)(int);//不可省略*p两边的括号! |
指针变量的类型及含义
结构体
struct 结构体名{ |
枚举
enum 枚举类型名字{名字0,…,名字n};
声明枚举量也可以指定值
和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
文件读写
fopen(文件名,使用文件方式);
fopen("a1","r"); |
使用文件方式
常用下面方法打开一个文件
if((fp=open("file1","r"))==NULL){ |
fclose关闭数据文件
读写一个字符的函数
读写一个字符串的函数
易混淆
表达式 | 值 |
---|---|
a++ | a原来的值 |
++a | a+1以后的值 |
a– | a原来的值 |
–a | a-1以后的值 |
++a:先加再用
a++:先用再加
杂项
- 随机数的生成
|