初识C语言 – L
初识C语言
大家好,我是新来的菜鸟,我来开始给大家讲解自己理解的C语言。讲的不好还望不要喷的太厉害了(手动滑稽)。谢谢大家的观看!!!
什么是C语言?
首先我们讲一下啥是语言,人和人不就是用语言交流嘛,那语言种类有很多种比如说汉语呀、英语(想必大家多多少少都学过一点吧,我这种菜鸟就是英语没学(手动滑稽))、德语或者日语等等其他语言。那我们知道了语言就是用来进行交流的嘛。人和人可以用上面所述的语言交流,但是人和机器呢?那不就是机器语言咯(明知故问)。是的,机器语言,说到机器语言这就得提起我所熟悉的那几个,汇编语言(好像现在很少用了吧?)、C语言、C++、C#(有木有跟我刚见到这个语言一样的念成c井,其实它叫C sharp)、Java、Python呀,其他的我就好像听得比较少了吧,毕竟新人嘛,嘿嘿,都体谅体谅一下哈,多谢!回归正题什么是C语言,书上是这样说的:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、**MSVC、Turbo C等。
看了这么多笼统的解释还是有繁琐的,所以就这样认为吧,C语言就是一门计算机编程语言,是人和计算机交流的语言。个人理解有错误的话希望大家指点指点,感谢!
第一个C语言程序
说了这么多概念,还是来点实际的吧,大家可以去网上搜索C语言编程软件,各种各样的都有,这里分享一下我使用的软件,我使用的是Vs2022,下面我给大家演示一下第一个C语言程序:
#include <stdio.h> //头文件的包含 //-->注释符号
int main()
{
printf("Hello World!
");
return 0;
}
上面是代码块,我们可以看到这个黑色的框框里面出现了HelloWorld这几个字符。
C语言规定每个程序都要主函数(main),C语言代码都是从主函数开始执行的。而且主函数有且只有一个哦。stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。return 0; 语句用于表示退出程序。printf()函数是打印函数,就是用来在屏幕上打印信息的。
数据类型
数据类型什么是数据类型呢?在生活中有许多不一样的数据,比如说我有一个朋友他年龄20岁,身高190cm,名字叫“小顾”,或者比如说买个瓶水2元钱,或者是买菜16.9元钱…..等等。我们需要记录这些不同类型的数字,在计算机中就需要不同的数据类型来表示。而C语言中基本数据类型有这几种:
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
解释一下这几个不同类型吧,char
类型是用来表示一个字符类型的,就比如说字符a。而short int long long long
这几个都是用来表示整数的,比如说20、100、50000等等。float double
这两种呢就是用来表示小数的,比如说3.1415….后面列举不出来了忘了这个圆周率了,只是说它们的精度不同也就是小数点后面的个数不同。那C语言没有字符串类型吗?也就是像这样的“i like China”。好像确实没有明确哪种类型是字符串类型,但是有个是用char [12]="i like China"
表示字符串类型的。
那既然有这么多类型,那它们的大小是多少呢?C语言中规定求类型大小是用sizeof关键字,大小是字节
#include <stdio.h>
int main()
{
printf("%d
", sizeof(char));
printf("%d
", sizeof(short));
printf("%d
", sizeof(int));
printf("%d
", sizeof(long));
printf("%d
", sizeof(long long));
printf("%d
", sizeof(float));
printf("%d
", sizeof(double));
printf("%d
", sizeof(long double));
return 0;
}
通过观察我们可以知道
数据类型 | 类型大小 |
---|---|
char |
1 |
short |
2 |
int |
4 |
long |
4 |
long long |
8 |
float |
4 |
double |
8 |
大家第一次看到这个字节可能有点疑问,其实换个符号大家可能就认识了,byte,大家看见有木有点熟悉,不熟悉的话再换一个KB或者MB、GB这样大家应该会熟悉了。其实在计算机当中,单位有比特位,字节这一说,计算机中最小的单位是字节,而一个字节是8个比特位。一个比特位很简单,就是0或者1。
说明一下:为什么会出现这么多不同类型呢?
这是因为每个类型所占的内存空间大小不同,所以我们合理使用不同的类型,可以节省内存空间,避免浪费嘛,你说是吧(手动滑稽)。
变量和常量
看见这两个词会怎么理解?我用最通俗易懂的话来讲:变量就是那些可以被改变的值。常量就是不能被改变的值。
举个例子:
变量:年龄、体重、薪资、存款等…..
常量:圆周率、身份证号码、血型等…..
变量
定义变量
在C语言中定义变量的方法是怎样的呢?
之前了解了数据类型是什么,定义变量那就是想要什么类型的变量就定义什么类型的变量。
C语言定义变量的方式是:类型 变量名 = 初始化值;
int age = 20;
float weight = 45.5f;
char ch = "w";
变量的分类
- 局部变量 定义在函数体内或者说 在
{}
内部 - 全局变量 定义在函数体外
#include <stdio.h>
int a = 10;//全局变量
int main()
{
int a = 100;//局部变量
return 0;
}
通过上面代码大家应该知道了什么是全局变量和局部变量了吧。
看为什么出错了呢?虽然a变量是在函数体中,也是局部变量,但是为什么就错了呢?那是因为{}
限制它的作用范围。再看
这样又没有问题了,所以说在函数内部的虽然是局部变量但是它的作用范围会被限制的,作用范围下面会说到的,各位客官请勿着急。
接下来我们看个例子
#include <stdio.h>
int b = 2019;//全局变量
int main()
{
int a = 2020;//局部变量
//这里局部变量与全局变量同名了 会发生什么呢?
int b = 2021;//局部变量
printf("b = %d
",b);
return 0;
}
可以看到,当全局变量与局部变量同名时候,优先使用的是局部变量。
变量的使用
我们了解了怎么定义变量,现在我们了解怎么去使用它。
计算两个数的和,num1,num2,从键盘输入数值,求和然后打印到屏幕上代码如下:
#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
", sum);
//这里介绍一下输入,输出语句
//scanf 输入语句 顾名思义是向计算机输入值
//printf 输出语句 上面有使用过,就是在屏幕上打印一段信息
return 0;
}
大家如果也是用的是VS2022或者VS2019,在这个代码运行时会出现一个错误,那就是scanf函数unsafe,意思就是这个函数不安全,这个时候我们可以在后面加上 _s
就变成了scanf_s
,或者大家不想这么麻烦的话就在源文件最上面加上define _CRT_SECURE_NO_WARNINGS 1
即可。
上述图片只是展示了变量的一种用法,后续还会有其他用法,之后用到再说。现在只是初步认识一下C语言。
变量的作用域和生命周期
之前有提到过作用范围。而接来下要讲的作用域就跟作用范围有关。
作用域
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的
而限定这个名字的可用性的代码范围就是这个名字的作用域 。
可以这样理解作用域就是作用范围,个人的理解哈。我们用代码形式来观察
可以看见,程序可以正常运行,那我们看下面:
这下报错了,为啥呢?这就是作用域的问题了。看完局部变量,我们来看全局变量:
可以看见全局变量作用域是整个工程。得出结论
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
生命周期
看见生命周期我们会想到什么?人的一生?从出生到离开这个世界,这也算是是生命周期。
官方的解释是:
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
那变量的声明周期呢?变量什么时候创建、什么时候销毁,这之间的时间段。
用事实来说话,眼见为实,咱们看代码效果图:
我们之前讲作用域时,不输入下面那条printf()
函数语句时是不会报错的,但是添加了后为什么又报错了呢?这就是这个变量a
的生命周期到了,出了{}
后a变量生命周期到了就自行销毁了。所以后面的输出语句执行就会报错。全局变量的生命周期应该不用我说了吧(手动滑稽)?跟全局变量的作用域有关。
小结:
- 局部变量的生命周期:进入作用域生命周期开始,出作用域声明周期结束。
- 全局变量的生命周期:整个程序的生命周期。程序结束了全局变量生命周期也就到头了。
常量
常量:不可变的值。C语言中定义常量和定义变量的形式是不同的。
C语言中常量可以分为以下几种
-
字面常量
-
const
修饰的常变量 -
#define
定义的标识符常量 -
枚举常量
#include <stdio.h>
#define MAX 1000 //#define的标识符常量
//枚举常量
enum COLOR
{
RED,
GREEN,
BLUE
}
//RED,GREEN,BLUE皆是枚举常量
int main()
{
//1.字面常量
3.1415926;//浮点型常量
1000;//整型常量
"a";//字符常量
"hello"//字符串常量
//2.const修饰常变量
//int num = 20;//变量
const num = 20;
num = 50;//加上const后能否改变?
printf("num = %d
",num);
return 0;
}
看代码作用还是小了点,咱们看点实际点的。
可以看到num
这个变量是可以被改变的,接下来再看:
加上const
就修改不了了,这是怎么回事?因为被const修饰的变量叫做常变量,具有常属性,常属性就是不能被改变的属性,虽然不能被改变,但是它本质上还是个变量。
我们创建数组时,[]
内要是个常量,大家可以看到错误信息,这说明n
是个变量。你这不是废话嘛又没加上const
修饰。那好我们加上const
修饰一下看看会怎样?
喏,看见没,即便加上const
修饰,结果还是一样的,这证明了什么,这就证明了const
修饰的变量,本质上还是个变量,只是具备了常属性,也就是不能被修改的属性。
再看一个枚举常量,枚举就是一一列出来,像三原色、性别等等可以一一列举出来的值。它们都是有实际值得。我们也可以打印出来的。
这里我把#define
定义的标识符常量也放进去了,定义了枚举常量三原色,并且也一一列举了,可以看到#define
定义的也是个常量,无法被修改,再看枚举常量它们其实也是有值的,而且还是递增的值,但能不能改呢?其实不能,但是可以给它赋初值。
可以看到赋初值后,下一个也会跟着上面的初值改动而改动的。
字符串+转义字符+注释
字符串
什么是字符串?在C语言中,字符串就是一串字符。怎么表述的呢?用“”
括起来的一串字符就是字符串。
最重要的一点是,字符串结束的标志是一个‘’
的转移字符。因为在计算字符串长度的时候‘’
是结束标志,不算做字符串的内容,但是用数组存储字符串的时候,数组的长度需要将‘’
计算上,只是单独计算字符串长度是不计算‘’
#include <stdio.h>
int main()
{
//C语言中用字符数组存储字符串,数组也就是一组类型相同的元素的集合
char str1[]="hello";
char str2[]={"h","e","l","l","o"};
char str3[]={"h","e","l","l","o",""};
printf("%s
",str1);
printf("%s
",str2);
printf("%s
",str3);
return 0;
}
我们来看一下上面代码的执行效果:
咦?为什么第二个跟其他两个不一样呀?这就是跟字符串结束的标志有关。我们调试一下看看这几个数组中放的是什么。
可以看到第一个和第三个数组放的都是一样的,而第二个少了个‘’
,而且第一个数组不是5个字符吗,怎么多了一个,之前说字符串结束的标志是‘’
,因为第一个数组是用来存储字符串的,所以会默认在结尾加上‘’
只是不会显示出来。但是在计算数组长度的时候就会把‘’
加上去。接着说第二个为啥是这样的,因为第二个数组最后一个不是‘’
所以会在内存中后面去找‘’
,找到‘’
之前的数据也会被打印出来,所以第二个就是会是这样打印的。
转义字符
转义字符?啥是转义字符呢?字面意思,转变意思的字符。
如果我们要在屏幕上打印一个目录:d:vs2022 est.c
。我们该如何写代码呢?之前我们用过printf
函数打印信息。
#include <stdio.h>
int main()
{
printf("d:vs2022 est.c
");
return 0;
}
为啥跟我们期待的不一样呢?我们看代码上面有语法高亮,v
跟
这个都改变了颜色,说明它们是一样类型的。之前打印其他信息的时候会看见
‘
,这个我们通过观察应该知道这是一个换行的标志,相当于在末尾加了一个回车键。这就是转义字符了,那在C语言中又有那些转移字符呢,下面我列一张表给大家观看观看。
’
转义字符 | 意义 |
---|---|
? | 在书写连续多个问号时使用,防止它们被解析成三字母词 |
“ | 用于表示字符常量 ‘ |
‘’ | 用于表示一个字符串内部的双引号 |
用于表示一个反斜杆,防止它被解释为一个转移字符 | |
a | 警告字符,会发出蜂鸣声 |
退格符号 | |
f | 进制符号 |
换行 | |
回车 | |
水平制表符号 | |
v | 垂直制表符号 |
ddd | ddd表示1~3个八进制数字。如:157X |
xdd | dd表示2个十六进制数字。 如:xFF 1 |
#include <stdio.h>
int main()
{
printf("%c
",""");
printf("%s
", """ ");
return 0;
}
会打印什么呢?
这样大家知道转移字符的用法了吗?下面我们再看一道题提示:strlen()
是计算字符串长度(不计算‘’
哦)。
#include <stdio.h>
int main()
{
printf("%d
", strlen("abcdef"));
// 32被解析成一个转义字符 8进制里是不会有8的哦
printf("%d
", strlen("c: est328 est.c"));
return 0;
}
大家答案是多少呢?6 18 还是6 14呢?
答案是6 18 的小伙伴算错了哦。大家可以看上面的转义字符表再来计算哦。
注释
注释大家应该一下子就能理解吧,就是用来解释代码的意思或者是有些不需要的代码也可以注释哦。
注释用两种风格:
-
C语言风格的注释
/*xxxxxxx*/
- 缺陷是不能嵌套注释
-
C++风格的注释
//xxxxxxxx
- 可以注释一行也可以注释多行
选择语句
选择语句顾名思义就是用来选择的语句。就好比,我们进入了学校,是好好学习呢?还是不学习呢?好好学习,毕业了就有好工作,不学习,毕业了就回家种田吧。这就是选择。选择语句也叫分支语句。
graph TD
A[进入学校] –> C{好好学习?}
C –> |好好学习| D[好工作]
C –> |不学习| E[回家种田]