1、运算符
取模运算符:%
增量运算符:++ 前缀,后缀
减量运算符:--
+=, -=, =, /=, %=
2、类型转换基本规则:
(1)当出现在表达式里,有符号和无符号的char 和 short 类型都将被自动转换为int,在需要的情况下,将自动被转换为unsigned int
(2)在包含两种数据类型的任何运算里,两个值都被转换称两种类型里较高的级别
(3)类型级别从高到低为:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int, int
(4)当作为函数的参数被传递时,char 和 short 会被转换为int,float会被转换为double,可以通过函数原型来阻止自动提升的发生
强制转换类型:(type) 变量名
3、函数
返回值类型 函数名(参数列表) //没有参数就用void , 形参:函数里声明的参数,实参:传递给参数的值
{
statement;
}
4、关系运算符
<, <=, ==, >=, >, !=
5、for循环
for (count = 1; count <= NUMBER; count++)
{
statement;
}
可以使用逗号运算符在for循环中使用多个初始化或更新表达式
for (a = 1, b = 2; a < 100; a++, b++)
{
statement;
}
逗号运算符:从左到右执行
6、do while循环
do
{
statement;
} while (boolean)
7、数组
type arrayName[size];
数组元素编号从0开始,直到size-1
char数组,并且存在的最后一个元素是 \0 ,则该数组是字符串
C90, c99:
int m = 3, n = 4;
int arr1[m], arr[n]; c90不允许,c99允许
初始化:type arrayName[size] = {值列表};//当数值数目少于数组元素数目时,多余的数组元素被初始化为默认值
const type arrayName[size] = {值列表};//定义只读数组
变量和数组元素未初始化的数值是不确定的
指定项目初始化:
int arr[6] = {[5] = 212};//C99 把arr[5]初始化为212
指定项目初始化注意事项:
int day[12] = {31, 28, [4] = 31, 30, 31, [1] = 29};
各元素的值: 0->31, 1->29, 2->0, 3->0, 4->31, 5->30, 6->31, 7->0, 8->0, 9->0, 10->0, 11->0
数组和指针:
arr[3]恒等于(arr + 3)
&arr[3]等于arr + 3
变长数组:
并不表示在创建数组后,可以修改其大小。变长数组的大小在创建后就是保持不变的,“变”的意思是说其维大小可以用变量来指定
int sum2d(int rows, int cols, int ar[rows][cols]);
int sum2d(int, int, int ar[][]);//C99
8、if语句
if (expression)
{
statement;
}
if (expression)
{
statement;
}
else //else与最近的if配对
{
statement;
}
9、getchar(), putchar();
char ch = getchar();//接收一个字符
putchar(ch);//输出一个字符
10、ctype.h 系列字符函数
isalnum() 字母或数字
isalpha() 字母
isblank() 空白字符(空格、水平制表符、换行)
iscntrl() 控制符
isdigit() 阿拉伯数字
isgraph() 除空格以外的字符
islower() 小写字母
isprint() 可打印字符
ispunct() 标点符号
isspace() 空白字符:空格、换行、走纸、回车、垂直制表符、水平制表符
isuper() 大写字母
isxdigit() 十六进制数字字符
tolower() 返回小写字符
toupper() 返回大写字符
14、逻辑运算符
&&, ||, ! 具有短路性
#include <iso646.h> 后,可以使用 and, or, not
15、stdbool.h
提供bool,true,false的定义,使用布尔类型时需要include
16、条件运算符
expression ? if-true-expression : if-false-expression;
17、循环辅助语句 continue, break
continue:
(1)忽略剩余代码,进行下一次迭代
(2)位于嵌套结构中,忽略里层循环
break:
终止循环
18、switch语句
switch(expression)
{
case exp1:
statement;
break; //如果没有break会往下执行
default:
statement;
break;
}
19、goto语句
(1)定义标签
标签名:
(2)跳转
goto 标签名;
20、缓冲分类
完全缓冲I/O, 行缓冲I/O
对于完全缓冲输入来说,缓冲区满时被清空(内容被发送至其目的地),这种类型的缓冲通常出现在文件输入中,缓冲区的大小取决于系统,但512字节和4096字节是常见的值
对于行缓冲I/O来说,遇到一个换行字符时将被清空缓冲区,键盘输入是标准的行缓冲,按下回车键将清空缓冲区
21、file_efo.c
#include <stdio.h>
#include <stdlib.h> //为了使用exit()
int main()
{
int ch;
FILE *fp;
char fname[50];
printf("Enter the name of the file:");
scanf("%s", fname);
fp = fopen(fname, "r");
if(fp == NULL)
{
printf("Failed to open file. Bye\n");
exit(1);
}
while((ch = getc(fp) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}
22、函数
返回值类型 函数名(类型 参数名, 类型 参数名)
{
}
void fuc();//不会进行参数检查
void fuc2(void);//表明该函数确实不使用参数,编译器就会检查确实有没有使用参数
递归:
调用自己的函数称为递归
递归函数必须在某一条件下返回确定的值,否则产生无限调用
对形参使用const修饰符,编译器会把形参当作常量来对待,无法修改
23、地址运算符 &
24、取值运算符 * 也叫间接运算符
声明一个指针: 类型 * 指针名
指针可以作为函数的参数
取指针地址——指针变量同其他变量一样具有地址和数值,使用运算符&可以的饿到存储指针本身的地址
常量或非常量数据的地址赋给指向常量的指针是合法
只有非长脸该数据的指针才可以赋给普通的指针
const int * pc;//指向常量int类型的指针,指针可改,数据不可改
int * const pc2;//常量指针,指针不可改,数据可改
const int * const pc3;//指针不可改,常量不可改
定义指向多维数组的指针: int (* pz)[2];//pz指向一个包含2个int值的数组
指针之间的赋值规则比数值类型的赋值更加严格,类型不同就不行
25、复合文字
创建一个包含两个int值的无名称数组:
(int [2]) {10, 20}
(int []) {10, 20, 30}
26、字符串I/O
gets(字符串数组名):最后一个元素是\0,返回获取的字符串的地址,如果出错或gets()遇到文件结尾,返回一个空地址
puts(字符串|字符串数组);
字符串数组初始化:
(1)char array1[size] = "this is a string.";
(2)char array2[size] = {'t', 'h', 'i', 's', 'i', 's', 'a', 's','\0'};//这种方式最后一个元素必须是\0,多余的数组会被初始化为\0
区别:
char heart[] = "I love";//不能用于++, --
char *head = "I like";//可用于++, --
主要区别在于数组名heart是个常量,而指针head则是个变量
head = heart;//合法
heart = head;//非法
fges()函数:多用于文件读取
(1)第二个参数来说明最大读入字符数,如果这个参数值为n,fgets()就会读取最多n-1个字符或者读完一个换行符为止
(2)如果fgets()读取到换行符,就会把它存到字符串里,而不是想gets()那样丢弃它
(3)第三个参数来说明读哪一个文件。使用stdin作为参数,从键盘上读数据
scanf(), gets():
scanf更基于获取单词而不是获取字符串,gets函数会读取所有的字符,直到遇到第一个换行符为止
puts(地址参数):参数是一个地址
显示字符串时自动在其后添加一个换行符,直到遇到空白字符\0
fputs()函数:多用于文件读取
第二个参数说明要写的文件,使用stdout作为参数来进行输出显示
fputs()并不为输出自动添加换行符
27、字符串函数 string.h
strlen()函数:返回字符串的长度
strcat()函数:两个参数为char * 类型,将第二个参数附加到第一个参数后面
strncat()函数:三个参数,第三个指定第二个参数添加到第一个参数的长度,当加到足够字符或遇到空字符时停止
strcmp()函数:两个字符串参数,a1>a2返回1,a1=a2返回0,a1<a2返回-1
strncmp(a1, a2, int)函数:第三个参数指定a1, a2比较的字符串长度
strcpy(a1, a2)函数:把a2的内容复制到a1,要保证a1的控件足够大容纳,返回第一个参数的字符的地址,第一个参数可以使数组中的中间的一部分
声明一个数组将为数据分配存储控件,而声明一个指针只为一个地址分配存储空间
strncpy(a1, a2, length):第三个函数指明最大可复制的字符数,如果a2比length大,则没有添加空字符,因此需要设置n为目标数组大小减1,然后将最后一个数组元素赋值为'\0'
sprintf(存储, 转换说明字符, 项目列表)函数:跟printf类似,将结果存储到存储地址里
常用:
char *strcpy(char * s1, const char * s2);
把s2指向的字符串(包括空字符)复制到s1指向的位置,返回值是s1
char *strncpy(char * s1, const char * s2, size_t n);
把s2指向的字符复制到s1指向的位置,复制的字符数不超过n个,返回值是s1.空字符后的字符不被赋值,如果原字符串的字符数少于n个,在字符串中就以空字符填充。如果源字符串的字符数大于或等于n个,空字符就不被赋值,返回值是s1
char *strcat(char * s1, const char * s2);
s2指向的字符串被复制到s1指向字符串的结尾,复制过来的s2所指字符串的第一个字符覆盖了s1所指字符结尾的空字符,返回值是s1
char *strncat(char * s1, const char * s2, size_t n);
s2字符串中只有前n个字符被追加到s1字符串,复制过来的s2所指字符串的第一个字符覆盖了s1所指字符结尾的空字符,s2字符穿中的空字符及其后的任何字符都不会被赋值,并且追加一个空字符到所得结果后面,返回值是s1
int strcmp(const char * s1, const char * s2);
如果s1字符串在机器编码顺序中落后于s2字符,函数的返回值是一个整数;如果两个字符串相同,返回值是0;如果第一个字符串在机器编码顺序中先于第二个字符串,返回值是一个负数
int strncmp(const char * s1, const char * s2, size_t n);
函数的作用和strcmp()一样,只是比较n个字符后或者遇到第一个空白字符时会停止比较,由二者中最先被满足的那一个条件终止比较过程
char * strpbrk(const char * s1, const char * s2);
返回一个指针,指向字符串s1中存放s2字符中的任何字符的第一个位置,如果没有找到任何字符,返回空指针
char *strrchr(const char * s, int c)
返回一个指针,指向字符串s中字符c最后一次出现的地方(标志结束的空字符是字符串的一部分,因此也可以搜索到它),如果没找到该字符,函数就返回空指针
char *strstr(const char * s1, const char * s2)
返回一个指针,指向s1字符串中第一次出现s2字符串的地方,如果在s1中没找到s2字符串,函数就返回空指针
size_t strlen(const char * s)
返回s字符串中的字符个数,其中布包裹标志结束的空字符
char *strcpy(char * s1, const char * s2)
网友评论