目录
1.什么是C语言
2.C语言的基本数据类型
2.1 变量和常量
2.1.1 常量
在程序运行过程中,其值不能改变的量称为常量。如:圆周率,身份证,性别等
分类:整型常量、浮点型常量、字符常量、符号常量、字符串常量。
C语言中的常量可以分为以下几种
* 字面常量
* const 修饰的常变量
* #define 定义的标识符常量(#define max 100)
* 枚举类型( enum color{ red,green,blue}; )
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pai = 3.14f; //这里的pai是const修饰的常变量
pai = 5.14;//是不能直接修改的!
//#define的标识符常量 演示
#define MAX 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的
return 0;
}
2.1.2 变量
在程序运行过程中,其值可以改变的量为变量。
变量声明和使用:
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
分类:局部变量:、全局变量
*当局部变量和全局变量同名的时候,局部变量优先使用
#include <stdio.h>
int global = 2019;//全局变量
int main()
{
int local = 2018;//局部变量
return 0;
}
变量的作用域:
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个程序
变量的生命周期:
局部变量的生命周期从进入作用于开始,出作用域结束。
全局变量的生命周期是整个程序的生命周期。
2.2 整形
整型分为整形常量和整形变量。
1.短整型(short):内存中占2个字节,取值范围:-32768 ~ + 32767 (2 Bytes)。
2.基本整形(int):4字节,-2147483648 ~ +2147483647。
3.长整型(long):同 int
4.长长整形(long long):8字节。
2.3 实型(又称浮点型)
1.单精度(float):4字节,至少能精确表示小数点后6位有效数字。格式说明符:%f
2.双精度(double):8字节,至少能精确表示小数点后12位有效数字。格式说明符:%lf
3.长双精度(long double):12字节
2.4 字符型
1.字符常量:用一对单引号括起来的单个字符称为字符常量。如‘A’,‘6’等
2.字符变量:字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值存储到内存单元中。
2.5 字符串
C语言没有字符串类型,“ajsjas”双引号引起来的是字符串字面值。
C语言规定:在存储字符串常量时,系统会在字符串末尾会加一个 \0 作为结束标志。
2.6 转义字符
转义字符 | 功能 |
---|---|
\n | 换行 |
\t | 横向跳格 |
\v | 竖向跳格 |
\b | 退格 |
\r | 回车 |
\f | 走纸换页 |
\a | 响铃 |
\\ | 反斜杠\ |
\0 | 字符串结束标志,0,表示空 |
\' | 单引号 ' 字符 |
\" | 双引号 " 字符 |
\ddd | ddd表示1~3个八进制数字。如:\130表示八进制130的数88代表的ASCII码值: x |
\xdd | dd表示2个十六进制。如:\x30 0 |
打印格式 | 功能 |
---|---|
%d | 打印整形 |
%c | 打印字符 |
%s | 打印字符串 |
%f | 打印 float类型的数据 |
%lf | 打印double类型的数据 |
%zu | 打印sizeof的返回值 |
3. 操作符
3.1 算术操作符
+、- 、*、/ 、% 加减乘除和取余
注意:
1.加减乘除用于整数和浮点数的运算
2.%运算符只能用于两个整数相除,返回余数。
3.当使用/运算符时,如果两个操作数均为整型,那么执行整数除法,运算结果也为整型;如果两个操作数至少一个为浮点数,那么执行浮点数运算,运算结果为浮点型。
3.2 移位操作符
<<、>> 左移位和右移位
移动的是补码的二进制序列。
3.2.1 左移位
移位规则:左边抛弃,右边补0。
将要移位的数字的二进制形式的补码(整数在内存中存储的是补码)向左移位,左边的抛弃,右边补0.
3.2.2 右移位
右移位分两种:算术移位和逻辑移位
1.算数移位规则:左边用该值的符号位填充,右边丢弃。
2.逻辑移位规则:左边用0补充,右边丢弃。
3.3 位操作符
&、 | 、^
符号说明:
& ---> 按位与(两个二进制操作数对应位同为 1 ,结果位才为 1 ,其余情况为 0 。“有0出0”)
| ---> 按位或(两个二进制操作数对应位只要有一个为 1 ,结果 位 就为 1 ,其余情况为 0 “有1出1”)
^ ---> 按位异或(相同为0,相异为1)
3.4 赋值操作符
=、+=、-=、*=、/=、^=、&=、|=、>>=、<<=
3.5 单目操作符
! 、- 、+ 、&、sizeof、~(对一个数的二进制按位取反) 、--(前置、后置--)、++(前置、后置++)、*、(类型)强制类型转换、
3.6 关系操作符
<、<=、>、>=、!=、==、
3.7 逻辑操作符
&&逻辑与-并且
|| 逻辑或-或者
3.8 条件操作符(三目操作符)
exp1 ?exp2 :exp3
真 ? 对 : 错
假 ? 错 : 对
如果满足exp1的条件就返回exp2,否则exp3
3.9 逗号表达式
(exp1, exp2,exp3,exp4 );
用逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果。
3.10 下标引用、函数调用和成员结构
[] 、()、. 、->
4. 选择语句
选择结构指的是进行逻辑判断,当满足与某些条件的时候才会执行某些语句。
4.1 if语句
if语句通过判断表达式的值从两种选项中选择一种。if语句有三种情况:
4.1.1 if语句
if (表达式)
{
语句块1;
}
当只有 if 的时候,表达式为真就执行语句块1,否则就跳过语句块的内容。
4.1.2 if...else语句
if (表达式)
{
语句块1;
}
else
{
语句块2;
}
当 if…else 的时候,表达式为真就执行语句块1,表达式为假就执行语句块2。
4.1.3 if…else if…else 语句
if (表达式1)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
其执行过程如下:
4.2 switch语句
if语句处理两个分支,当处理多个分支时需使用多个if-else语句,而switch语句可以直接处理多个分支(当然包括两个分支)。
switch(表达式1)
{
case 表达式2:
语句块2;
break;
case 表达式3:
语句块3;
break;
case 表达式4:
语句块4;
break;
……
default:
语句块n;
break;
}
注意:
1.当语句块后面没有 break时,程序就会继续执行下面的内容,直到遇到break才会跳出switch结构。
2.当语句块后面都有break时,case出现的次序不影响执行结果。
3.case后面包含多个语句时,不需要加大括号(从 :开始执行)。
4.多个case可以共用一组执行语句。例如:
case '表达式1':
case '表达式2':
case '表达式3': 语句块; break;
5.循环语句
循环语句是用于重复执行某条语句(循环体)的语句,它包含三个部分,分别是初始化部分、判断部分和调整循环部分。C语言提供了3中循环语句,分别为while
语句,do while
语句和for
语句。
5.1 for循环
for( 循环变量初始化 ; 循环判断 ; 循环变量自增 )
{
循环体;
}
for循环流程图:
5.2 while循环
//while循环的语法
while(表达式)
{
循环语句;
循环变量自增;
}
while循环流程图:
5.3 do...while循环
//do...while循环语法
do
{
循环体语句;
循环变量自增;
}while( 循环判断 );
do...while循环结构图:
注意:
1.while循环是“先判断,后执行”,而do...while是“先执行后判断”。
2.循环体语句组可以是单个语句、空语句,也可以是复合句,当循环体是单个语句时,可以省略花括号。如:while (i<=100)sum+=i++;
3.为了使循环结束,不出现“无限循环”“死循环”,要使循环语句中有使表达式趋于“逻辑假”的语句,如:“i++;”语句
4.变量的初始值要在while语句之前赋给。
6.函数
函数的定义是子程序。子程序是一个大型程序中的某部分代码,由一个或多个语句块组成,他负责完成某项特定的任务,而且相较于其他的代码,具备相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软
件库。
#include <stdio.h>
//定义Add函数
int Add(int x, int y)
{
int z = x+y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
//使用Add函数
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
7.数组
7.1 数组的定义
//定义一个整形数组,最多放是个元素
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
7.2 数组的下标
int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
int arr[ 10 ] | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
7.3 数组的使用
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
8.常见的关键字
auto 、break、case、char、const、continue、default、do、double、else、enum、extern、
float、for、goto、if、int、long、register、return、short、signed、sizeof、static、
struct、switch、typedef、union、unsigned、void、volatile、while
8.1 typedef
typedef:类型定义,类型重命名,数据类型取别名。
//将unsigned int重命名为uint
//将struct Node重命名为Node
typedef unsigned int uint;
typedef struct Node
{
int data;
struct Node*next;
}Node;
int main()
{
//unsigned int num = 0;等价于
uint num2 = 1;
// struct Node n; 等于
Node n2;
return 0;
}
8.2 关键字static
在c中static是用来修饰变量和函数的
1.修饰局部变量-称为静态局部变量
2.修饰全局变量-称为静态全局变量
3.修饰函数-称为静态函数
8.2.1 修饰局部变量
#include <stdio.h>
void test()
{
//int a = 1;
static int a =1;
//用static修饰局部变量时候局部变量出了作用域是不销毁的,
//本质上static修饰局部变量,改变了变量的存储位置,存在了静态区。
a++;
printf("%d",a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
8.2.2 修饰全局变量
//全局变量,是具有外部链接属性的
int g_val = 2022;
//static修饰全局变量的时候,
//全局变量的外部链接属性变成了内部链接属性,其他源文件就不能再使用这个全局变量了。
//static int g_val = 2022;
//声明外部符号
extern int g_val;
int main()
{
//没有static修饰,这里就可以使用g_val,有static修饰就不能使用。
printf("%d\n",g_val);
return 0;
}
8.2.3 修饰函数
//函数也是具有外部链接属性
int Add(int x,int y)
{
return x + y;
}
//用static修饰函数,函数就不再具有外部链接属性,
// static int Add(int x,int y)
// {
// return x = y;
// }
extern int Add(int x,int y);
int main()
{
int a =10;
int b = 20;
int c = Add(a,b);
printf("%d\n",c);
return 0;
}
8.3 关键字register-寄存器
电脑的存储设备:(读写速度由快到慢,空间由小到大,造价由高到低)
1.寄存器(集成到CPU上)
2.高速缓存
3.内存 8/16G
4.硬盘
int main()
{
//建议:3存放在寄存器中
register int num = 3;
return 0;
}
9.#define定义常量和宏
//#define定义标识符常量
#define NUM 100
int main()
{
printf("%d\n",NUM);
int n = NUM;
printf("%d\n",n);
int arr[NUM] = {0};
return 0;
}
//#define 定义宏
//宏有参数
//函数是传参,宏是直接替换
//宏的参数是无类型
#define ADD(x,y) ( (x)+(y) )
int main(){
int a = 10;
int b = 20;
int c = ADD(a,b);
pruntf("%d\n",c);
return 0;
}
10.指针
10.1内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
为了有效的使用内存,把内存划分成一个个小的内存单元,每个内存单元的大小是一个字节。为了能够有效的访问到内存的某个单元,给内存的每个单元进行编号,这些编号被称为该内存单元的地址。
10.2指针和指针变量
1.指针:指针其实就是地址,
通常的,我们在程序中定义了一个变量a,在编译时这个变量a会向内存中申请一定的内存来存储变量a的值,系统则根据变量的类型给变量分配一定长度的字节数.
通过地址可以找到所需的变量单元,因此可以说地址“指向”该变量单元,在c语言中,将地址形象化地称为“指针”。
2.指针变量:用一个变量专门存放指针(地址),称为指针变量。
int main()
{
int a = 10;//int 类型4个字节
// &a,取地址操作符
printf("%p\n",&a);//0x0012ff40(地址)
//指针变量的定义
// 类型名 *指针变量名;
int* p = &a;//p就是指针变量
*p = 20;//解引用操作符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象
printf("%d\n",a); //a=20
return 0;
}
11.结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
定义结构体:先定义结构,再声明结构变量。
struct Stu
{
char name[20];
int age;
char sex[10];
char tele[12];
};
void print(struct Stu * ps)
{
printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).tele);
//结构体指针变量->成员名
printf("%s %d %s %s\n", ps -> name, ps -> age, ps -> sex, ps -> tele );
}
int main()
{
struct Stu s = {"张三",20,"男","123456789123"};
//结构体对象.成员名
printf("%s %d %s %s\n",s.name,s.age,s.sex,s.tele);
print(&s);
return 0;
}