C语言入门系列
1.带你了解C语言,零基础入门①
2.带你了解C语言,零基础入门②
3.带你了解C语言,零基础入门③
前言
这是博主的第一篇学习博客,所写内容一定会有不足之处,希望读者能多多包涵理解,也希望各位大佬在阅读后能及时指出其中的问题,作者一定会积极采纳建议,不断改进,不断进步。在此感谢各位的指正。
本文的内容主要是C语言其中的一些基础知识,在阅读后每个人都可以对C语言有一个大概的认识。当然每一个知识点就是简单认识,日后,博主会陆续按C语言学习顺序,去做详细讲解。篇幅较长,建议收藏食用。
这个C语言学习系列,我会一直做下去,请持续关注博主,你们的支持与鼓励是我更新的最大动力!!
目录
1.初识C语言
1.1 什么是C语言
1.2 学习C语言的理由
1.2.1 设计特性
1.2.2 高效性
1.2.3 可移植性
1.2.4 强大而灵活
1.2.5 面向程序员
2.第一个C语言程序
2.1 main函数
2.2 库函数
2.2.1 printf函数
3.数据类型
3.1 char类型
3.2 int类型
3.3 long、long long类型
3.4 short类型
3.5 float、double类型
4.常量和变量
4.1 变量
4.1.1 定义变量的方法
4.1.2 变量的分类
4.1.3 变量的使用
4.1.4 变量的作用域和生命周期
4.2 常量
4.2.1 字面常量
4.2.2 const 修饰的常变量
4.2.3 define 定义的标识符常量
4.2.4 枚举常量
5.字符串、转义字符、注释
5.1 字符串
5.2 转义字符
5.3 注释
结言
1.初识C语言
1.1 什么是C语言
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。并且保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译。简单来说,C语言就是人与计算机进行交流时所使用的编程语言。
1.2 学习C语言的理由
在过去的许多年中,C语言就已成为最重要、最流行的编程语言之一。C生万物,C语言是母体语言,是人机交互接近底层的桥梁。近50年间,在TIOBE排行榜中,C/C++位置长期霸占前三名,没有丝毫撼动,C语言凭借自身实力在众多语言中脱颖而出,可谓经典永不过时。在学习C语言的过程中,就可以发现它的许多优点。下面,介绍其中较为突出的几点。
1.2.1 设计特性
C是一门流行的语言,融合了计算机科学理论和实践的控制特性。C语言的设计理念让用户能轻松地完成自顶向下的规划、结构化编程和模块化设计。因此,用C语言编写的程序更易懂、更可靠。
1.2.2 高效性
C是高效的语言。C语言充分利用了当前计算机的优势,因此C语言相对更加紧凑,而且运行速度很快。
1.2.3 可移植性
C是可移植的语言。这意味着,在一种系统中编写的C程序稍作修改或不修改就能在其他系统运行。
1.2.4 强大而灵活
C语言功能强大且灵活。C程序可以用于解决物理学和工程学的问题,甚至可用于制作电影的动画特效。
1.2.5 面向程序员
C语言是为了满足程序员的需求而设计的,程序员利用C可以访问硬件、操控内存中的位。C语言有丰富的运算符,能让程序员简洁地表达自己的意图。另外,大多数C实现都有一个大型的库,包含众多有用的C函数。这些函数用于处理程序员经常需要解决的问题。
2.第一个C语言程序
//写一个简单代码
//在屏幕上输出hello world
#include <> //头文件
int main() //主函数
{
printf("hello world\n"); //使用printf函数打印hello world
return 0; //在main函数结束时,返回一个值
}
在这一个简单的C语言程序中,有两个重要函数需要大家注意一下
2.1 main函数
main函数作为程序的入口,一个工程中有且只有一个。意思就是说,如果在一个工程中有多个文件,只可以有一个main函数。
2.2 库函数
库函数是C语言本身所提供的,使用时需要引用即可。引用格式为 #include <>,在上面这个程序中,我们所使用的是printf函数,其所对应的库函数为(standard input ),引用这个头文件,就可使用此函数。日后的学习过程中,我们还会遇到许多库函数,库函数在C语言的学习中也同样重要。
接下来我们深入学习一下printf函数。
2.2.1 printf函数
printf函数的功能是将特定格式的数据输出到屏幕上,没有加格式的话就原封不动的打印。打印不同的数据需采用不同的控制符。
控制符 | 输出形式 |
%d | 按十进制整型数据的实际长度输出 |
%ld | 输出长整型数据 |
%c | 用来输出单一字符 |
%f | 用来输出单精度浮点数 |
%lf | 用来输出双精度浮点数 |
%s | 用来输出字符串 |
%x | 以十六进制形式输出整数 |
3.数据类型
在讲数据类型之前,应该先明白计算机中的存储单位。字节是计算机的内存单元,计算机中是采用二进制的,由数字0、1构成(通常实际生活中使用十进制,是由数字0~9构成的)。存放一个二进制0或1时,就会占用1bite(比特)的内存空间,1Byte(字节)= 8bite,1KB = 1024byte,1MB = 1024KB,1GB = 1024MB,以此类推还有TB,PB等。
在计算机中,数据存放在存储单元中,存储单元由有限个字节构成,每一个存储单元中存放的数据的范围是有限的,不可能存放无穷大的数,也不可能存放无限循环小数。C语言提供了许多数据类型,为什么一种类型不够用?因为C语言让程序员针对不同情况选择不同的类型。可描述整数、小数、单一字符或者字符串。这就有了多种多样的数据类型。不同的数据类型,在计算机内存空间中所占据的大小也不相同。常见的数据类型有以下几种。
3.1 char类型
char类型为字符数据类型,一般用于存储字符(如字母或标点符号)。
char ch = 'w';
char grade = 'A';
3.2 int类型
int类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整数或零。其取值范围依计算机系统而异。
int a = 0;
int grade = 100;
3.3 long、long long类型
通常,程序代码中使用的数字(如2345)都被存储为int类型。如果使用1000000000这样的大数字超出了int类型能表示的范围,通常会使用long类型来定义整型,如果还不够大,就用long long类型来定义整型。其本质上还是整型,其值必须是整数。
long history = 5000000;
3.4 short类型
short类型与long类型恰好相反,用于存放一些较小整数。
3.5 float、double类型
C语言中有各种各样的整数类型(int、long、long long),浮点类型也是不可缺少的,在面向金融和数字的程序经常使用浮点数。C语言中常见的浮点类型有float、double类型,浮点类型能表示包括小数在内更大范围的数。
C标准规定,float类型必须至少能表示6位有效数字,指float类型必须能够表示33.333333的前6位数字,而不是精确到小数点后6位数字。
C语言提供的另一种浮点类型是double(意为双精度)。double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字。
float pi = 3.14159;
4.常量和变量
生活中的有很多值是不变的(如:圆周率,性别,身份证号码,血型等),也有很多值是可变的(如:年龄、体重、薪资等)。在C语言中,用常量来表示不变的值,用变量来表示可变的值。
4.1 变量
在编程过程中,变量的使用非常广泛,类似数学中 x = 5 这样的公式,x是变量,x的值是可以改变的。变量是指在程序运行过程中,其值可以改变的量。
4.1.1 定义变量的方法
变量是一个标识符或者名称,给变量命名时,应该做到见名知意,便于交流和维护。
变量的3个基本要素:变量名,类型和值。
C语言的变量在程序中主要以变量名的形式出现,命名规则如下:
(1)由字母、数字和下划线组成,并且变量的第一个字符只能是字母或下划线。如 add,sum,average,score,math。
(2)C语言编码系统将大写字母和小写字母视为不同的字符,即大、小写字母分别为两个不同的变量。
(3)命名的原则一般是见名知意,方便阅读。如 int sum 和 float average,可以很轻易地看出sum可能是代表求和的,average可能是代表求平均数的。
(4)变量应先定义后使用。只有先定义,编译器在程序中遇到该变量时才能识别它。
int age = 18;
float weight = 78.5;
char ch = 'p';
//类型+变量名+值
4.1.2 变量的分类
变量可分为局部变量和全局变量,下面我用一段代码演示。
#include <>
int a = 100; //全局变量
int main()
{
int b = 10; //局部变量
return 0;
}
{}就是一个代码块。简单地说,在代码块内部定义的变量就是局部变量,在代码块外部定义的变量就是全局变量。
当两个变量名相同时,局部变量是优先于全局变量的。如下图。
可以看到,局部变量是优先打印的。所以当局部变量和全局变量同名的时候,局部变量优先使用。
4.1.3 变量的使用
变量在使用时只需要将变量直接写在表达式中,该变量将参与该表达式的计算。C语言的变量
在程序中主要以变量名的形式出现。下面用一个求和的程序来展现变量的使用。
#include <>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:");
scanf("%d %d", &num1, &num2);//scanf函数输入函数
sum = num1 + num2;//求和
printf("sum = %d\n", sum);
return 0;
}
4.1.4 变量的作用域和生命周期
(1)作用域
作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
即,局部变量的作用域是变量所在的局部范围,而全局变量的作用域为整个工程。
(2)生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时期,就像一个事情的开始和结束。
局部变量的生命周期是:进入作用域,生命周期开始。出作用域,生命周期结束。
全局变量的生命周期是:整个程序的生命周期。
4.2 常量
在程序运行过程中其值不能被改变的量称为常量。例如,x = 5 + 8;语句中的"5"和"8",这类数据在程序执行过程中是固定的,不会发生变化。C语言中的常量通常分为以下四种。
#include <>
enum Sex//定义枚举常量
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pi = 3.14;//这里的pi是const修饰的常变量
pi = 5.14;//错误,const修饰的常变量是无法直接修改的!
//#define 定义的标识符常量
#define MAX 100
printf("MAX = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
4.2.1 字面常量
字面常量是C语言中最常见的常量,如3.14, 500, 'a', 'b'
4.2.2 const 修饰的常变量
const为C语言中的一个关键字,被const修饰的变量会具有某种常属性——只可被读取,但不可被修改。但其本质上他还是一个变量,只不过具有常属性,所以叫做常变量。
上面例子中的 pi 就是被const 修饰的常变量
4.2.3 define 定义的标识符常量
相对于const修饰的常变量,define定义的就是一个正儿八经的常量了。
定义方法为 #define 名称 数据,定义好后,即可在程序中将定义好的标识符常量直接使用。
4.2.4 枚举常量
当某些数据,需要一一列举时,就可以创建枚举常量来表示,和define定义的标识符常量一致,使用时直接引用即可。
如上述打印结果,枚举常量的默认是从0开始,依次向下递增1的。
5.字符串、转义字符、注释
5.1 字符串
"Hello my friend!"
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。双引号不是字符串的一部分,双引号仅告知编译器它括起来的是字符串。
字符串的结束标志是一个 \0 的转义字符,在计算字符串长度的时候 \0 是结束标志,不算做字符串内容。
上面的代码就是将字符串,放入字符数组中(数组的定义,后续博主还会讲解)。
看到这段代码的运行结果,读者应该大致明白\0的作用了吧,\0作为字符串长度的结束标志,倘若在自己定义数组中不加入\0结尾的话,printf会随机打印,直到遇见\0,那么就会停止。所以创建一个数组的过程中,当把字符串中的字符逐个放入数组时,还要记得在末尾加上一个\0。
我们再看一段代码。
如图,我们并没有在数组结尾加入\0,打印出来的name是正确的,这是为什么呢?没什么没加结束标志,打印也停止了呢?原因就是当字符类型的数组,空间有剩余时,会在结尾自动存入\0。你看,计算机其实也可以自己处理这些细节。
我们现在用sizeof函数和strlen函数(两者皆为库函数,作用是求字符串的大小和长度)来验证\0的存在。需引头文件 <>
为什么两个函数打印出来的结果不相同呢?这从侧面说明了\0的存在,当sizeof计算空间大小\0要额外占用一字节的空间,而strlen本质上是计算出\0前的字符数。
5.2 转义字符
转义字符是特殊的字符型常量。转义字符以反斜线“ \ ”开头,反斜线后面可跟一个或几个字符。转义字符不同于字符的原意,具有特殊的意义,所以称为转义字符。
假如我们要在屏幕上打印一个目录:c:\code\,我们该如何编写代码?
#include <>
int main()
{
printf("c:\code\");
return 0;
}
预期中,我们想得到 c:\code\,实际上程序运行的结果是这样的:
这里就不得不提一下转义字符了。转义字符,顾名思义就是转变意思。下面我们看一些转义字符。
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问好时使用,防止他们被解析成三字母词(不常用) |
\' | 用于表示字符常量 ' (单引号) |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣(响铃) |
\b | 退格符,将当前位置移到前一列 |
\f | 进纸符,将当前位置移到下页开头 |
\n | 换行符,将当前位置移到下一行开头 |
\r | 回车,将当前位置移到本行开头 |
\t | 水平制表符,功能与tab键相同 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字 |
\xdd | dd表示2个十六进制的数字 |
我们回到最开始,那么如何在屏幕上打印 c:\code\ 呢?不废话,直接上图。
你看,掌握转义字符后,就可以轻松打出完整目录了。
5.3 注释
注释在我们学习C语言包括将来使用C语言的过程中也是必不可少的,相信细心的读者也能发现,在博主的一些代码中有添加注释,那么注释有什么用呢?
(1)代码中有不需要的代码可以直接删除,也可以注释掉。
(2)代码中有些代码比较难懂,可以加一下注释文字,试想当你辛苦编写出的代码,别人丝毫看不懂,那又有什么用呢?
接下来,我们讲解两种注释风格:
C语言风格的注释: /*xxxxxxxxxxxxxxxxxxxx*/
C++风格的注释://xxxxxxxxxxxxxxxx
注意:C语言风格的注释不能嵌套注释,而C++风格可注释一行,也可注释多行,博主比较推荐使用C++风格注释。
给大家看一下两种注释方法的效果。
#include <>
int Add(int x, int y)
{
return x + y;
}
/*C语言风格注释
int sub(int x, int y)
{
return x - y;
}
*/
int main()
{
//C++注释风格
//int a = 10;
//调用Add函数,完成加法
int a = 10;
printf("%d\n", Add(1, 2));
return 0;
}
结言
感谢你们的耐心阅读,博主本人为一名大一新生,也还有需要很多学习的东西。写这篇文章是以本人所学内容为基础,日后也会不断更新自己的学习记录,我们一起努力进步,变得优秀,小小菜鸟,也能有大大梦想,关注我,我们一起学习。
《C语言小白入门》这一系列,我会根据篇幅分为两到三篇,我们下期再见。