一个基本的C程序首先看的就是对库的导入:
#include
1、
2、
3、
4、
以下是
函数名 | 作用 |
---|---|
sin(x) | 求x弧度的正弦值 |
cos(x) | 求x弧度的余弦值 |
tan(x) | 求x弧度的正切值 |
asin(x) | 求反三角函数arcsin(x),得到的结果的弧度 |
acos(x) | 求反三角函数arccos(x),得到的结果是弧度 |
atan(x) | 求反三角函数arctan(x) |
2、指数和对数
函数名 | 作用 |
---|---|
exp(x) | 求e的x次方的值 |
log(x) | 求以自然对数e为底x为真数的结果 |
log10(x) | 求以10为底x为真数的结果 |
3、乘幂和开方
函数名 | 作用 |
---|---|
pow(x,y) | 求x的y次方的值,y可以为分数 |
fabs(x) | 求x的绝对值 |
sqrt(x) | 求x开方的值 |
fmod(x) | 求x除以y后的余数 |
C语言中常用的数据类型有以下:
char:字符型
unsigned char:无符号字符型
int:整型(4字节)
unsigned int:无符号整型(4字节)
long int:长整型
float:单精度浮点型(4字节)
double:双精度浮点型(8字节)
此表从上到下,表示优先级从高到低:
运算符 | 含义 |
---|---|
++ | 自增 |
– | 自减 |
! | 逻辑非 |
- | 负号运算符 |
+ | 正号运算符 |
* | 乘法 |
/ | 除法 |
% | 取余 |
+ | 加法运算符 |
- | 减法运算符 |
<,>,<= ,>= | 关系运算符 |
==、!= | 等于,不等于 |
&& | 逻辑与 |
|| | 逻辑或 |
= | 赋值运算符 |
, | 逗号运算符 |
此处列出的只是常用的运算和和优先级,并非所有的,需要完整运算符及优先级顺序可参见以下博客:C语言运算符优先级列表(超详细)
在C语言中最常用的输入和输出函数是printf()和scanf()函数:
1、printf()输出函数
int a = 3;
printf("%d",a);
2、scanf()输入函数同理
int a;
scanf("%d",&a); //需要使用取值符
3、常用的数据格式
%d:整型数据
%c:字符型数据
%f:单精度浮点型数据(float)
%lf:双精度浮点型数据(double)
%s:字符串数据(常量、数组或指针)
4、get-put类输入输出
这4个函数主要都是用于获得字符串和输出字符串的函数:
其实gets和puts是可以用getchar和putchar来实现的:
char ch;
while((ch=getchar())!='\n')
{
putchar(ch);
}
printf('\n');
char a[10];
gets(&a);
puts(a);
1、if语句
if(判断条件){
操作...
}
else if(条件){
操作...
}
else{
操作...
}
2、条件运算符
max = (a>b)?a:b;
这个语句的意思就是如果a大于b满足,则max等于a;否则就等于b
该思想也可以用于宏定义中:
#define B(a,b) a>b?a:b
该行表示的就是取a与b之间较大的一个数,然后赋值给max。
当然宏定义还有很多种用法,比如:
#define PI 3.1415926 //不带参的宏定义
#define Sum(a,b) a+b //带参的宏定义
3、switch控制语句
switch(判断量){
case 常量1: 语句1;break;
case 常量2: 语句2;break;
...
case 常量n: 语句n;
default: 语句;
}
1、while循环语句
就是只要满足条件就一直循环的语句,括号内只需要一个判断条件就行。
while(判断条件){
操作...
}
2、do while循环语句
就是至少执行一次的语句,执行一次do之后,再去判断while的括号是否成立,如果成立则再执行do中的内容;如果不成立,则跳出循环。
注意:while后有个分号
do{
操作...
}while(判断条件);
3、for循环语句
for(语句1; 语句2; 语句3){
操作...
}
for括号内的三个语句都用分号隔开,语句1常用来赋初值(可空);语句2是判断循环的条件(必须有),如果满足就执行循环;语句3是当执行完一次循环之后进行的操作(可空),常用来自增或自减。例如:
for(i=0; i<=10; i++){
操作...
}
1、函数的定义
类型标识符 函数名 (类型名 形参1, 类型名 形参2, ...){
函数中的操作...
}
2、函数的调用
函数名([实参列表]);
3、函数的用法经验
(1)定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。当编写函数的时候,一开始不要想着函数如何传参和函数的返回值应该是什么;
(2)而是当在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机;
(3)当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值。
1、一维数组的定义和引用
类型名 数组名[常量] = {值1, 值2,...};
int a[10] = {1, 2, 3};
数组名[下标];
int a[3] = {1, 2, 3};
printf("%d",a[2]);
2、二维数组的定义和引用
类型名 数组名[常量1][常量2] = {{值1, 值2,...}, {值11, 值12,...}};
int a[2][3] = {{1,2,3}, {4,5,6}};
int a[2][3] = {{1,2,3}, {4,5,6}};
printf("%d",a[1][2]);
以上是输出第1行第2列的元素,即6,下标是从开始排的。
3、转义字符
字符形式 | 含义 |
---|---|
\a | 响铃 |
\n | 换行,将当前位置移到下一行开头 |
\t | 水平制表,跳到下一个tab位置 |
\b | 退格,将当前位置移到前一列 |
\r | 回车,将当前位置移到本行开头 |
\f | 换页,将当前位置移到下页开头 |
\v | 竖向跳格 |
\ | 反斜杠字符’’ |
’ | 双引号字符 |
" | 空字符(字符串结束标志) |
\ddd | 1-3位八进制ASCII码所代表的字符 |
\xhh | 1-2位十六进制ASCII码所代表的字符 |
4、指针
该知识点和用法在以下文章中已有详细介绍:
C语言指针深入透析(原来你一直没有搞懂C语言指针是因为没有理解其中的规律)
1、字符串连接函数:strcat(s1, s2) //将字符串s2连接到是s1
2、字符串复制函数:strcpy(s1, s2) //将字符串2拷贝到字符串1中
3、字符串比较函数:strcmp(s1, s2) //若s1
4、字符串长度函数:strlen(s) //返回字符串s的实际长度,不包括末尾的\0
5、存储空间赋值函数:memset(s, 'e', 5) //将字符数组s前5个字符设置成字符‘e’
6、存储空间拷贝函数:
int a[5] = {2,3,4,5,6}, b[5];
memcpy(b, a, sizeof(a));
//将数组a中的内容拷贝到数组b中,空间大小为a的空间大小
7、字符处理函数:就是专门处理字符的函数,常用的有以下几个
int isupper(ch); //检查ch是否为大写字符
int islower(ch); //检查ch是否为小写字符
int isdigit(ch); //检查ch是否为数字字符
位运算主要是用于二进制和其他进制的计算,是数字电子技术和计算机基础类课程都会学到的基础内容。
1、按位与&: 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
0000 0011
0000 0101
0000 0001
按位与的结果是3&5=1
//C语言代码:
#include
main()
{
int a = 3;
int b = 5;
printf("%d",a&b);
}
2、按位或| :两个相应的二进制位中只要有一个为1,该位的结果值为1
0011 0001
0000 1001
0011 1001
按位或的结果是49|9=57
//C语言源代码:
#include
main()
{
int a = 49;
int b = 9;
printf("%d",a|b);
}
3、按位异或^ :若参加运算的两个二进制位值相同则为0,否则为1,
即0∧0=0,0∧1=1,1∧0=1, 1∧1=0
0011 1001
0010 1010
0001 0011
按位异或的结果是:57^42=19
//c语言源代码:
#include
main()
{
int a=57;
int b = 42;
printf("%d",a^b);
}
4、取反运算~ :~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
0000 1001——>原数9
1 111 0110——>取反的结果是246
//C语言源代码:
#include
main()
{
int a = 9;
printf("%d",~a);
}
5、 左移<< :用来将一个数的各二进制位全部左移N位,右补0
将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即0000 1111,左移2位得0011 1100。
//C语言源码
#include
main()
{
int a=15;
printf("%d",a<<2);
}
6、右移>> :将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
0000 1001——>数字9
0000 0010——>又移2位后的结果是2
#include
main()
{
int a = 9;
printf("%d",a>>2);
}
另外需要注意的是,根据编译系统的不同,右移之后左边可能补0也可能补1。移如0称为逻辑右移,移入1称为算数右移。
7、位运算赋值
位运算符与赋值运算符可以组成复合赋值运算符。
1、用typedef声明新类型名
typedef long long int LLint; //将类型long long int起个名字叫LLint
LLint a=12334555, b; //定义两个long long int类型的变量
typedef int * INTP; //给int类型的指针起个名字叫INTP
INTP p1, p2; //定义p1和p2两个指针
2、结构体
(1)结构体类型的声明
struct 结构体名称
{
类型名1 成员名1;
类型名2 成员名2;
...
类型名n 成员名n;
}变量1, 变量2... ; //后面有个分号不能忘
(2)结构体变量、指针、数组的定义
struct student
{
char name[20];
int age;
double score;
}std1, *pstd=&std1; stds[3];
其中,student是结构体类型,是一种数据类型了(与int、char这种一样);
然后,std1是一个student类型的变量,pstd是student类型的指针,stds是student类型的一维数组。
(3)结构体变量的引用
有三种方式可以引用结构体变量,其中.称为成员运算符,->称为指向运算符。
3、用结构体构造链表
在C语言中的链表简单来说就是:结构体变量中含有指向同类结构体变量的成员,就是拥有一个next指针成员,然后每次执行结构体都会自动跳转到下一个地址继续执行。
struct student
{
char name[20];
int age;
double score;
struct student *next;
}
以上,next指针就是指向下一个结构体变量的指针成员,当然这只是简单的链表,还有更深入的动态链表,此处就不做介绍了。
4、共用体
共用体的定义和结构体基本相同:
union 共用体名称
{
类型名1 成员名1;
类型名2 成员名2;
...
类型名n 成员名n;
}变量1, 变量2... ; //后面有个分号不能忘
因此,共用体变量的引用也和结构体一样;它们之间的差别就是对内存的占用情况不同,对于只把C语言当成使用工具的开发者来说,这其实并不是需要掌握的重点。
1、动态类变量
auto变量 | register变量 | |
---|---|---|
局部作用域 | 本函数内 | 本函数内 |
生存期 | 动态存储 | 本函数内 |
2、静态类变量
static变量 | extern变量 | 不加任何说明符 | |
---|---|---|---|
作用域 | 本文件内 | 可扩展文件 | 本文件内 |
生存期 | 静态存储 | 静态存储 | 静态存储 |
1、文件指针:FILE *指针变量名;
2、打开与关闭
FILE *fopen("文件名", "使用方式");
fclose(文件指针);
3、文件使用方式及含义
使用方式 | 含义 |
---|---|
“r”(只读) | 为输入打开一个文本文件 |
“w”(只写) | 为输出打开一个文本文件 |
“a”(追加) | 向文件文件尾添加数据 |
“rb”(只读) | 为输入打开一个二进制文件 |
“wb”(只写) | 为输出打开一个二进制文件 |
“r+”(读写) | 为读写打开一个文本文件 |
“w+”(读写) | 为读写建立一个新的文本文件 |
“a+”(读写) | 为读写打开一个文本文件 |
“rb+”(读写) | 为读写打开一个二进制文件 |
“wb+”(读写) | 为读写建立一个新的二进制文件 |
“ab+”(读写) | 为读写打开一个二进制文件 |
4、文件输入输出
fprintf(文件指针, "格式控制", 地址列表);
fprintf(文件指针, "格式控制", 地址列表);
getc(文件指针);
putc(文件指针);
fgets(字符指针, 位数, 文件指针);
从ASCII文件中读入字符串fputs(字符指针, 文件指针);
把字符串输出到ASCII文件中5、二进制文件读写
fwrite(待传出数据的其实地址, 要写入的字节数, 多少个字节的数据, 文件指针);
fread(起始地址, 要读入的字节数, 多少个字节的数据, 文件指针);
6、读写位置与定位
feof(文件指针);
fseek(FILE *p, long offset, int origin);
ftell(文件指针);