文章目录
- 前言
- 一、什么是C语言
- 二、第一个C语言程序
- 三、数据类型
- 四、变量,常量
- 1、变量
- 1.1 变量的命名
- 1.2 变量的分类
- 1.3 变量的使用
- 1.4 变量的作用域和生命周期
- 2、变量
- 五、字符串
- 1. 概念
- 2. 求解字符串的长度【strlen】
- 3. 转义字符【含笔试题】
- 六、注释
- 七、选择语句
- 八、循环语句
- 九、函数
- 十、数组
- 1、数组的定义
- 2、数组的下标
- 3、数组的使用
- 十一、操作符
- 1、算数运算符
- 2、移位操作符
- 3、位操作符
- 4、赋值操作符
- 5、单目操作符
- 6、关系操作符
- 7、逻辑操作符
- 8、条件操作符
- 9、逗号表达式
- 10、其他
- 十二、常见关键字
- 1、前言
- 2、有关数据存储的底层原理
- 3、typedef关键字
- 4、static关键字
- 4.1、static关键字修饰局部变量
- 4.2、static关键字修饰全局变量
- 4.3、static关键字修饰函数
- 十三、 #define 定义常量和宏
- 十四、 指针
- 1、引言
- 2、内存的概念和介绍
- 3、指针变量的大小
- 十五、结构体
前言
想必刚接触C语言的同学们不知道C语言是什么?,有什么用,那么你来对了,本系列就会带你入门C语言,从入门到“入土”,开玩笑的,正如标题所说,本教程首先对C语言有一个初步的认识,能够看懂别人写的是什么,有一个大概的框架,那么,我要开始讲解了。 这一章主要是初始C语言的一个大纲。
一、什么是C语言
C语言是什么?
语言:汉语,日语,英语等。语言是一个自然语言,是人与人交流的语言。
计算机语言:类比过来,是人与计算机之间的交流。C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语 言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性
二、第一个C语言程序
- 我们在了解完C语言是什么后,我们需要了解如何使用集成开发环境去完成第一个C语言程序。
什么是集成开发环境呢?
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。
像vscode就是一种编辑器,它不是集成开发环境,但是它可以添加许多的插件来编辑代各种形式的代码。
像vs2022就是一种集成开发环境,在平时使用很方便,但是存储空间比较大,毕竟有好有缺点嘛,不能两者兼容。
但是不要使用那种上古编译器比如VC++,DEV++…
接下来我们就开始正式写第一个C语言程序
- 进入官网下载VS2022,不要去别的地方下载那些盗版的!!!点击进入官网
- 点击个人免费下载,学习下载这个完全够用了。
- 打开下载
- 打开软件,创建一个新项目
- 在C语言的学习中,大多数人的第一个程序就是
hello word!
,那么我们怎么打印出hello word
,开始我们学习编程之旅,下面就跟着我来一起学习。
- 我们知道,C语言所有的字符,符号,都是英文的。
- C语言中代码是从
main
函数的第一行开始的。 - main函数是程序的入口,一个工程中
main
函数有且只有一个。 - 其中代码中的
printf
是编译器的头文件引入的,可以直接使用。 是头文件,后缀为
.c
是源文件,后缀.h
为头文件。
#includeint main(){printf("hello world!\n");return 0;}
- 有人可能看到我这里写的是
int main(){ ... return 0}
,通常就是这样写的,也是最普遍的写法
还有一种就是void main(){ },这种写法比较古老,现在不会使用这种写法。
三、数据类型
写出了我们的第一个C语言程序,接下来我们来说一说C语言中的数据类型
在了解数据类型前,我们先探究为什么要写程序?
- 是为了用程序解决生活中的一些问题。在现实生活中,我们的各种数据有很多不同的类型,为了更加丰富的表达生活中的各种值,所以在C语言程序中设置这么多数据类型。
char//字符数据类型short //短整型int //整形long//长整型long long //更长的整形float //单精度浮点数double//双精度浮点数
- 每种类型的字节大小是多少?
下图所显示的就是:
计算机中常见的单位:bit(比特),byte(字节),KB,MB,GB,TB,PB。
- 他们的单位换算为:
1 byte = 8 bit
1 KB = 1024 byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
1 PB = 1024 TB
四、变量,常量
在生活中有些值是不变的(比如:圆周率,性别,身份证号码,血型等等),有些值是可变的(比如:年龄,体重,薪资等等),引入了变量和常量的概念。
首先,先讲述一下变量:
1、变量
语法形式为:type + name。代码如下:
int age = 150;float weight = 45.5f;//浮点数默认为双精度浮点数,在后面加个f,说明是单精度浮点数类型char ch = 'w';
1.1 变量的命名
- 只能由字母(包括大小写),数字,下划线组成。
- 不能以数字开头。
- 长度不能超过63个字符。
- C语言是区分大小写的。
- 变量名字不能以
关键字
命名字。 - 变量的名字尽量有意义。
1.2 变量的分类
变量分为局部变量和全局变量
#include int global = 2019;//全局变量int main(){int local = 2018;//局部变量//下面定义的global会不会有问题?int global = 2020;//局部变量printf("global = %d\n", global);return 0;}
总结:
上面的局部变量
global
变量的定义其实没有什么问题的!
当局部变量和全局变量同名的时候,局部变量
优先使用。
1.3 变量的使用
了解了什么是变量,现在我们就要具体地去使用这个变量了,让我们一起来看看
#include 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;}
在vs编译时会发现,我们在这里会出现4996警告
。
- 为什么会出现这个警告呢?
是因为在vs中输入函数,微软有自己的定义scanf_s,而用scanf函数不安全。
如何消除这个警告呢?
- 第一种方法就是把
scanf()
改成scanf_s()
,scanf()
也是vs提供的,这种方式很简单,但是代码的跨平台,可移植性就变差了,不推荐这种方法。 - 第二种方法就是在
.c
文件中添加#pragma warning(disable:4996)
这样就不会提示这个告警了。 - 跟着下图一步一步的操作
- 首先下载everthing软件,下载好点击打开
- 搜索
newc++file.cpp
,打开文件
- 把这行粘贴进去
#define _CRT_SECURE_NO_WARNINGS 1
,后面还要加上个【1】不要忘了
- 这种方法一劳永逸,可以很好的解决我们的问题~~
再次创建一个.c
文件,可以看到自动就有那一行了
1.4 变量的作用域和生命周期
清楚了如果使用变量去编写程序,接下来我们来看一下变量的作用域和生命周期
作用域:
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的通常来说,一段代码中所用到的变量名并不总是有效的,而限定这个名字的可用性的代码范围就是这个变量名的作用域。
了解了其基本概念,我们就到代码中来演示一下
- 可以看到程序报错了,说【未定义标识符】,可以看出这个作用域具有限定范围的
int main(){{int a = 10;printf("a = %d", a);}printf("a = %d", a);return 0;}
- 以上的话就是局部变量的作用域
- 从下面代码可以看出,完全没有报出错误,因为对于全局变量的作用域,是从定义变量开始到整个程序运行结束,整个变量才会被销毁,而这个变量a,则是在这个代码块结束之后便会销毁,所以我们在后面才访问不到这个变量
- 对于全局变量的作用域,还可以这样使用,把这个b变量定义在add.c这个文件下,然后我们在
test.c
这个文件定义一下这个变量b,用这个extern
声明一下即可
生命周期:
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期
讲完了变量,接下去我们来讲讲常量
2、变量
C语言中常量分为一下几种:
- 字面常量
const
修饰的常变量- #define 定义的标识符常量
- 枚举常量
#include //举例enum Sex{MALE,FEMALE,SECRET};//括号中的MALE,FEMALE,SECRET是枚举常量//#define的标识符常量 演示#define MAX 100int main(){//字面常量演示3.14;//字面常量1000;//字面常量//const 修饰的常变量const float pai = 3.14f; //这里的pai是const修饰的常变量pai = 5.14;//是不能直接修改的!printf("max = %d\n", MAX);//枚举常量演示printf("%d\n", MALE);//0printf("%d\n", FEMALE);//1printf("%d\n", SECRET);//2//注:枚举常量的默认是从0开始,依次向下递增1的return 0;}
常量就是不变的量,所以叫常量
五、字符串
1. 概念
- 在讲字符串之前,我们先来看看下面这个,因为在计算机中存储、表示的都是二进制,所以我们打印出来的也会是一个二进制
- 首先定义一个char类型的字符变量ch,然后分别以%c、%d、%s去打印出来,可以看到,显示的结果各不相同
- %c打印的就是一个字符,%d打印的则是这个字符在ASCLL码表中的值,最后的%s,打印的就是ch这个字符串
- 然后开始讲一讲字符串
概念:双引号引起的一串字符叫做字符串
2. 求解字符串的长度【strlen】
说完了字符串了基本概念,了解了什么是字符串,接下去我们来看看如何入求解字符串的长度
- 对于字符串,大家要知道,结束标志是一个 \0 的转义字符,转义字符我们下个模块就讲到,这个
\0
表示这个字符串已经结束了。但是在计算字符串长度的时候,这个\0
是不计算在内的 - 也是说,求字符串的长度统计的是字符串中
\0
之前出现多少个字
那我们如何去求解一个字符串的长度呢?
- 这里我们需要使用到一个【string.h】头文件里的一个函数,叫做
strlen()
,可以计算一个字符串的长度,也就是\0之前的长度,这个函数我们后面会细讲
printf("len = %d\n", strlen("abc"));
前面我们说到过char类型可以定义一个字符变量,不仅如此,在这里,我们还可以定义一个字符数组,什么是字符数组呢?就是这个数组中存放的都是字符,我们来看一个具体的定义
char arr[] = "abcdef";
- 以上就是字符数组的基本定义
- 接着我们再来看一种,下面这一种也是字符数组的定义方式
char arr2[] = { 'a','b','c','d','e','f' };
- 可以看到,这两个字符数组中的内容是一样,那他们打印出来,以及计算出来的长度是否是一样的呢,我们一起来看一下
- 很明显,从以上结果来看,是不一样的,这是为什么呢?我们通过一张图示来了解一下
- 从以上这张图我们应该可以很明显地看出来,为什么第二个arr2数组在打印的时候会出现【烫烫烫】这种东西呢,如果你自己去编译器里试试的话应该也是这样,这里为什么呢,具体可以看看反汇编详解【函数栈帧】的创建和销毁
- 因为第二个数组的内容值给到了’f’,并不是一个完整的字符串,但是第一个数组给到的却是一个完整的字符串,所以自动拥有一个’\0’,第二个数组就没了,所以后面打印出来的只会是一个随机值,然后直至碰到一个\0为止,遍历才会结束
- 所以我们可以看到这个长度也是受到了影响,arr1数组的长度就是6,但是arr2数组的长度却是加上了一些随机字符后的长度,这就显得不准确了
3. 转义字符【含笔试题】
- 那什么叫做转义字符呢?我们通过代码来看看
int main(){printf("abcndef");printf("abc\ndef");}
- 通过运行结果我们可以看到,这个
n
,若是在其前面加上了一个\
,则它的意思就发生了变化,在转义字符里面就叫做【\n换行】,所以可以看到打印到【abc】就发生了换行,在后一行打印了def
- 然后我们再来看到一个打印一个test.c的路径
- 从运行结果来看,并没有真正地打印出来一个路径,而是出现了很多空格
- 细心的小伙伴应该可以发现这个test的第一个字符t和路径的\是同一个颜色,都淡化了,在转义字符里,这个叫做【\t水平制表符】,也及时们键盘上的【Tab键】,敲一下就能空出4个空格
- 所以我们在printf输出一个东西的时候,不要去写一些转义字符,那C语言中有哪些转义字符呢,我们一起来看一下
用一个表格给大家呈现:
转义字符 | 释义 |
---|---|
” />
分析
六、注释
七、选择语句
八、循环语句
然后我们通过一段代码再来看一下
九、函数
十、数组1、数组的定义
2、数组的下标
3、数组的使用
十一、操作符
1、算数运算符
|