如何学习
- 认真听课
- 及时完成每节课的作业
- CSDN:养成写博客的习惯
- GitHub:坚持上传代码
- 飞书:记笔记
- Xmind:一门课程学完后整理框架
- 挤时间学习,“欲戴王冠,必承其重”,要想有百万年薪就要付出对应的努力。要想超越别人就要走不一样的路,付出不一样的努力
- 拒绝做伸手党:遇到问题,先尝试自己解决问题,但也不要死磕,问问题不要拍照,学会截图!!!
- 学好编程,不仅仅是学好C语言!C语言仅仅是入门,编程≠C语言,C语言只是一门计算机语言而已。必须要学好:计算机语言、算法与数据结构、操作系统、计算机网络、项目实战、数据库
- 利用好比特的学习资源:不懂就问,但要先自己思考
C语言流行度高,值得学习
**「TIOBE 编程社区指数」**是一种衡量编程语言流行度的标准,由成立于 2000 年 10 月位于荷兰埃因霍温的 TIOBE Software BV 创建和维护。 该指数是根据网络搜索引擎对含有该语言名称的查询结果的数量计算出来的。该指数涵盖了 Google、百度、维基百科和 YouTube 的搜索结果
https://www.tiobe.com/tiobe-index/
课程规划
初阶(不是很懂原理)、进阶
初识C语言:基本了解C语言基础知识,对C语言有一个大概认识。每个知识点都是简单认识,不做详细讲解,后期课程细讲
- 什么是C语言
- 第一个C语言程序.
- 数据类型
- 变量、常量
- 字符串+转义字符+注释
- 选择语句
- 循环语句
- 函数
- 数组
- 操作符
- 常见关键字
- define定义常量和宏
- 指针
- 结构体
一些疑问
- 考证?
考试得到的证书,不能说明你的能力
1、什么是C语言
计算机语言:人和计算机交流的语言
C语言是一门通用计算机编程语言,广泛应用于底层开发,但也可以做软件开发
暂时无法在飞书文档外展示此内容
暂时无法在飞书文档外展示此内容
C语言标准
为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C(C89/C90),作为C语言最初的标准,后来推出C95,C99,C11,C17,C2x,但ANSI C 依然是使用最广泛的
编译器
C语言是一门面向过程的计算机编程语言,与C++, Java等面向对象的编程语言有所不同
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC(VS所使用)、Turbo C等
VS2022 - 集成开发环境(IDE)- 编辑器+编译器+调试器+图形用户界面等工具
2、第一个C语言程序
如何创建
- 编译器 - VS2022
- 创建项目
- 创建源代码
- 写代码
- 编译+链接+运行
源文件.c
头文件.h
如何写
main函数
写C语言代码,首先要写出主函数main
main`函数是程序的入口,程序从main函数的**第一行**开始执行的,**一个工程中有且只有一个main函数**,否则会报错:`❌函数"int main()"已有主体
{ }内的内容叫函数体
主流main
函数写法:
int main()
{
return 0;
}
其他main
函数写法:
//写法1
void main()
{
return 0;
}
//写法较老,虽然可能正常运行,但不推荐
//写法2
int main(void)
{
return 0;
}
//不影响使用,void表示main函数不接收参数,但此写法不如主流写法方便
//写法3
int main(int argc, char* argv[])
{
return 0;
}
//不影响使用,两个参数有特殊意义,以后再去研究,入门阶段不要这样写
printf函数
printf
是一个库函数 —— 由C语言编译器提供
功能:在屏幕上打印数据
库函数使用前提:得包含对应的头文件
printf的头文件:#include <stdio.h>
,std - standard标准 i - input输入 o - output输出
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
编译+链接+运行:快捷键CTRL+F5,建议不要使用F5(前者为标准用法)
3、数据类型
分为内置数据类型(C语言本身就具有的类型)和自定义类型(允许你自己创建出来的类型)
字符类型
char
//字符数据类型
整数类型
bool
(_Bool
)//布尔类型
short
//短整型
int
//整型
long
//长整型
long long
//长长整型
小数类型
float
//单精度浮点数
double
//双精度浮点数
常见:%c
- char
,%d
- int
,%f
- float
,%lf
- double
,%p
- 地址
在C语言中,浮点数默认为
double
类型。因此,当使用float
类型时,需要在数字后面添加"f"表示该数字是一个float
类型的值。如果不添加"f",则编译器会将该数字视为double
类型,并将其强制转换为float
类型,可能会导致精度损失或溢出错误
写小数时,即使定义变量类型为float
,编译器也会默认为double
类型,因此需要自己在后面加"f"才是真正的float
类型:
float a = 55.5f;//表示a变量为float类型,存储值为55.5
float a = 55.5; //表示a变量原始值为double类型,编译器将其强制转换为float类型,可能会出现精度损失或溢出错误的风险
printf("%d\n", sizeof(char)); //1字节
printf("%d\n", sizeof(_Bool)); //1字节
printf("%d\n", sizeof(short)); //2字节
printf("%d\n", sizeof(int)); //4字节
printf("%d\n", sizeof(long)); //4字节,C语言标准规定:sizeof(long) >= sizeof(int),在64位linux系统上是8字节
printf("%d\n", sizeof(long long));//8字节
printf("%d\n", sizeof(float)); //4字节
printf("%d\n", sizeof(double)); //8字节
sizeof单位是字节
32位环境用%d,64位环境用%lld,否则会警告
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
printf("%d\n", sizeof int);//错误写法,省略括号写法不适用于类型,而适用于变量
sizeof
后面括号能省略说明它不是函数,因为函数后的括号一定不能省略
sizeof
返回值类型是size_t
,它无符号整数类型,建议使用%zu打印(而不是%d或者%u)
可以自己创造类型,叫自定义类型
4、计算机单位
bit - 比特/位
byte - 字节
KB
MB
GB
TB
PB
…
1个bit只能用来存放二进制中的1个0/1
1Byte=8bit,其他相邻单位间换算比率为1024,即 2 10 2^{10} 210
5、变量、常量
变量的定义
int age = 150;
float weight = 45.5f;
char ch = 'w';//实际存储的是ASCII码值
变量的命名
- 只能由字母(包括大写和小写)、数字和下划线( _ )组成
- 不能以数字开头
- 长度不能超过63个字符
- 变量名中是区分大小写的
- 变量名不能使用关键字
变量的分类
- 局部变量 - 定义在大括号内部(不一定是主函数内)
- 全局变量 - 定义在大括号外部,是指可以在整个工程使用,但是可以改变的
局部和全局变量的变量名冲突时,局部优先,但不建议冲突
C语言中:
- 不允许在同一个作用域中定义多个相同名称的变量
- 允许在不同的作用域中定义多个相同名称的变量
- 不同作用域中定义的变量,在访问时采用就近原则
变量的使用
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d", &num1, &num2);//scanf格式需要与输入格式对应
sum = num1 + num2;
printf("%d\n",sum);
return 0;
}
VS编译器认为C语言提供的scanf函数是不安全的,所以VS提供了一个安全的版本scanf_s,但这个函数只有VS认识,兼容性不好,不推荐使用
scanf为何不安全
scanf不关心空间大小,写几个就放几个,不关心能放几个,会超出最大限度
解决方法(最方便):第一行添加 #define _CRT_SECURE_NO_WARNINGS 1
或(永久自动添加)
原理:VS中新建的源文件,都是拷贝 newc++file.cpp 文件的
使用everything软件搜索 newc++file.cpp ,将其拷贝到桌面,使用记事本打开方式打开,然后将#define _CRT_SECURE_NO_WARNINGS 1拷贝进去并保存,最后将修改后文件将原文件替换掉
作用域和生命周期
作用域
一个变量,哪里可以使用,哪里就是它的作用域
局部变量的作用域是变量所在的局部范围
#include <stdio.h>
int main()
{
int a = 0;
{
int b = 0;
}
printf("%d\n", a);
printf("%d\n", a);
return 0;
}
全局变量的作用域是整个工程,跨文件使用需要extern
声明外部符号
#include <stdio.h>
int a = 0;
void main()
{
printf("%d\n", a);
return 0;
}
int main()
{
printf("%d\n", a);
return 0;
}
//test1.c
int g_val = 2023;
//test2.c
#include <stdio.h>
extern int g_val;//声明外部符号:声明来自其他文件的外部符号
//想要使用#include "test1.c";达到相同效果是错误的,因为一般都是include头文件,而include源文件会出问题,因为可能导致变量、函数重定义
int main()
{
printf("%d\n", g_val);
return 0;
}
但是全局变量不安全,所有函数都能使用,所以要尽量避免使用全局变量
生命周期
变量的生命周期指的是变量的创建到变量的销毁(把空间还给操作系统)之间的一个时间段
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期是:整个程序的生命周期
常量
- 字面常量
20; //整型常量
3.14; //浮点型常量
'a'; //字符常量
"abcdef";//字符串常量
int a = 10; //拿字面常量给a赋值
char ch = 'w';//拿字面常量给ch赋值
- const修饰的常变量
const是常属性的意思,是一个C语言的关键字
int num = 10;
printf("%d\n", num);
num = 20;
printf("%d\n", num);
const int num = 10;
printf("%d\n", num);
num = 20;
printf("%d\n", num);//报错
上面的num被称为const修饰的常变量,本质上num还是变量,只是在语法层面限制了变量num不能直接被改变,具有了常属性,所以叫常变量
C++里面就彻底是常量了
证明:num 实质依然是变量
int arr[10] = {0};
int n = 10;
int arr[n] = {0};
//报错(变量)
const int n = 10;
int arr[n] = {0};
//报错(常变量)
说明:这里的n本质是一个变量,所以不能使用在数组定义时,指定数组大小
- #define定义的标识符常量
#include <stdio.h>
#define SIZE 10
#define CH 'W'
int main()
{
int arr[SIZE] = {0};
printf("%c\n", CH);
return 0;
}
可以理解为#define就是给常量取了一个名字
- 枚举常量
enum Sex
{
MALE,//值为0
FEMALE,//值为1
SECRET//值为2
};
enum COLOR
{
RED = 5,//值为5
GREEN = 9,//值为9
BLUE//值为10
};
int main()
{
MALE = 5;//错误
enum Sex s = MALE;
printf("%d %d %d\n", MALE, FEMALE, SECRET);//输出0 1 2
printf("%d %d %d\n", RED, BLUE, GREEN);//输出5 9 10
return 0;
}
括号中的MALE,FEMALE,SECRET叫枚举常量
枚举常量值默认是从0开始,依次向下递增1的
版本管理工具——git,团队开发,代码记录
代码托管平台——gitee
scanf函数返回的是读取到数据的个数,如果scanf函数读取失败会返回EOF(end of file),本质是-1
int a = 0;
int b = 0;
int n = scanf("%d", &a);
printf("%d", n);//1
int n = scanf("%d %d", &a, &b);
printf("%d", n);//2
三种多组输入写法
局部变量的作用域是局部变量所在的局部范围
arr[] = {‘b’, ‘i’, ‘t’};求长度是随机值
C99标准引入变长数组概念,这时允许数组大小是变量,但是这种数组不能直接在定义时就进行初始化,但可以用循环语句进行初始化
体重计算,double bmi = w/(h/100.0)*(h/100.0),w和h都是int
https://blog.csdn.net/zhaohuaonline/article/details/28241985
%2d、%-2d、%02d
\t水平制表符:一般是4个或8个空格,连带着前一个数据一起打印一个tab
%d\t可以使乘法口诀表对齐
isalpha判断是不是字母
高内聚低耦合
pow函数,n的k次方
数组逆序
void reverse_string(char* s)
{
int len = strlen(s);
if (*s == '\0')
{
return;
}
char tmp = s[0];
s[0] = s[len - 1];
s[len - 1] = '\0';
if (strlen(s + 1) >= 2)
{
reverse_string(s + 1);
}
s[len - 1] = tmp;
}
ohuaonline/article/details/28241985
%2d、%-2d、%02d
\t水平制表符:一般是4个或8个空格,连带着前一个数据一起打印一个tab
%d\t可以使乘法口诀表对齐
isalpha判断是不是字母
高内聚低耦合
pow函数,n的k次方
数组逆序
```C
void reverse_string(char* s)
{
int len = strlen(s);
if (*s == '\0')
{
return;
}
char tmp = s[0];
s[0] = s[len - 1];
s[len - 1] = '\0';
if (strlen(s + 1) >= 2)
{
reverse_string(s + 1);
}
s[len - 1] = tmp;
}