第01章:初识C语言
📍 来自:中南林业科技大学软件协会学术部:谢添
⏲ 时间:2022 - 10 - 05
✏️ 本章所有提供代码均已测试,读万卷书不如行万里路,一定要把代码都自己敲一遍并测试
💬 一件事,你若不想做,你会?找出千万个理由去拒绝,你若想做,你会绞尽脑汁的去想办法,做与不做,不在于你行不行,而在于你要不要。
1.什么是C语言
- C语言是一门通用的
计算机编程语言
,广泛应用于底层开发
。 - 尽管C语言提供了许多低级处理的功能,却仍然保持着
良好的跨平台特性
,一个标准规格写出的C语言程序可以在许多电脑平台上进行编译。 - C语言是一门纯面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
2.编译器选择
2.1 Visual Studio(VS)介绍
是一套非常完备的工具和服务,可帮助您为 Microsoft 平台和其他平台创建各种各样的应用程序。Visual Studio 还可将您所有的项目、团队和利益干系人联系在一起。现在您的团队可以从任何位置以虚拟方式进行更为敏捷的合作,无论他们采用何种开发工具。
可以通过强大的集成开发环境构建面向 Windows、Android、iOS 以及 Web 的出色应用。使用任何 IDE 或编辑器在云中进行版本控制、敏捷、持续交付、应用程序分析协作。
适用于所有操作系统的编辑器使用可在 Windows、OS X 或 Linux 上运行的免费代码编辑器构建和调试现代 Web 和云应用程序。
2.2 为什么选择VS
在学习C语言的过程中,编译环境和编辑器肯定是必不可少的。比如大家常见的VC 6.0
,Dev
,g++
等等,但是目前市场上使用最广泛,相对成熟的集成开发环境依旧是Visual Studio。
只是很多高校在教学实践中普遍采用VC或者Dev,因为文件小,安装便捷嘛!不过相对而言,这些软件对初学者往往不够友好,包括界面、提示符、文件系统等等。
而与之对应的,VS凭借它出色的界面、友好的操作方式和完备的体系得到很多开发者的青睐,所以也是奉劝一些仍在坚持学校的软件的学弟学妹入坑VS,只有四个字送给你们:绝对不亏!
2.3 下载与安装教程
👇 必学必会
🏠 VS官网:https://visualstudio.microsoft.com/zh-hans/vs/
🏠 推荐视频教程:https://www.bilibili.com/video/BV11R4y1s7jz/?spm_id_from=333.337.search-card.all.click
3.第一个C语言程序与基本结构
Hello World是一个最著名的程序。对每一位程序员来说,这个程序几乎是每一门编程语言中的第一个示例程序。实际上,这个程序的功能只是告知计算机显示Hello World这句话。传统意义上,程序员一般用这个程序测试一种新的系统或编程语言。对程序员来说,看到这两个单词显示在电脑屏幕上,往往表示他们的代码已经能够编译、装载以及正常运行了,这个输出结果就是为了证明这一点。这个测试程序在一定程度上具有特殊的象征意义。在过去的几十年间,这个程序已经渐渐地演化成为了一个久负盛名的传统。几乎所有的程序员,无论是在你之前,或在你之后,当第一次实现与计算机成功沟通之后,在某种程度上,他们的肾上腺素就会急剧上升(激动不已)。
#include<stdio.h> int main() { printf("Hello World:你好,软件协会"); return 0; }
3.1 具体结构
一个C程序就是由若干头文件和函数组成。
- #include <stdio.h>就是一条
预处理
命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。 - 函数就是实现代码逻辑的一个小的单元。
3.2 主函数
一个C程序有且只有一个主函数,即main函数。
- C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口。
- 而main前面的
int
就是主函数的返回值类型
。 printf()
是格式输出函数
,这里就记住它的功能就是在屏幕上输出指定的信息- return是函数的返回值,根据函数类型的不同,返回的值也是不同的。
\n
是转义字符中的换行
符。- C程序一定是从主函数开始执行的
3.3 规范
- 一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行。
- 函数体内的语句要有明显缩进,通常以按一下
Tab
键为一个缩进。 括号要成对写
,如果需要删除的话也要成对删除。- 当
一句可执行语句结束
的时候末尾
需要有分号
。 - 代码中所有符号均为
英文半角符号
。
4.0.前言
针对不同的数据,采取不同的存储方式和进行不同的处理。随着处理对象的复杂化,数据类型也要变得更丰富。数据类型的丰富程度直接反映了程序设计语言处理数据的能力。
C语言很重要的一个特点是它的数据类型十分丰富。因此,C语言程序数据处理功能很强。C语言丰富的数据类型可归纳如下:
我们现在要讲的呢,只是对数据类型的简单了解,我们后面的章节再详细讲解各种数据类型。当然,关于基本数据类型还有很多值得探究的地方,也会放在后面补充,毕竟一口气吃不了那么多,就像你能一下子追到你的男神或女神 💓 吗?肯定是要有个循序渐进,循循善诱的过程嘛💫
4.1 常见基本数据类型
类型 | 说明 |
short / short int | 短整型 |
int | 整型 |
long | 长整型 |
long long int | 更长的整型 |
float | 单精度浮点型 |
double | 双精度浮点型 |
char | 字符数据类型 |
💬 C语言没有字符串类型
哦,但是我们可以使用字符数组
,或者用指针指向字符串,现在不理解没关系,我们先在这稍微提一嘴
以上类型都有两种子类型:有符号数(signed XXX)
、无符号数(unsigned XXX)
。二者最大的区别:表示的值的范围大小不同,signed > unsigned。
4.2 数据类型字节大小与取值范围
在讲这个前,我们先来简单聊聊字节:
计算机最小的存储单位: bit
比特位。一个比特位存放一个二进制数字 0
/ 1
。
再大一点的单位是 byte
字节。一个字币=8个比特位。
它们之间的换算规则是这样的:
- 1 KB = 1024 byte ( byte 也可简写成 B )
- 1 MB =1024 KB
- 1 GB = 1024 MB
- 1 TB = 1024 GB
那字节大小如何确定取值范围的呢?
一个字节 = 8 bit 1 bit 可以存放 0 或 1 那么 1 bit 可以表示两个数:0 1 那么 2 bit 可以表示 2 * 2 即 4 个数:00 01 10 11 分别代表0,1,2,3 这样算下来,8 bit 可以存放2的8次方即256个数 那unsigned short类型占2字节,一共16 bit,不就可以表示65536个数吗 从 0 ~ 65536 不就是65535个数吗
这里其实还涉及到进制,如果你想了解进制,可以在软协官网下载资源《进制,原码反码补码,位运算》,帮你打通进制从而理解取值范围
也可以查看链接(CSDN上发表):https://blog.csdn.net/qq_62982856/article/details/126052638?spm=1001.2014.3001.5501
数据类型 | 字节大小 | 取值范围 |
short | 2字节 | -32768~32767 |
unsigned short | 2字节 | 0~65535 |
int | 4字节 | -2147483648~2147483647 |
unsigned int | 4字节 | 0~4294967295 |
long | 4字节 | -2147483648~2147483647 |
unsigned long | 4字节 | 0~4294967295 |
long long | 8字节 | 9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
unsigned long long | 8字节 | 0~18,446,744,073,709,551,616 |
float | 4字节 | -3.4*10^38~3.4*10^38 |
double | 8字节 | -1.7*10^308~1.7*10^308 |
long double | 8字节 | -1.7*10^308~1.7*10^308 |
unsigned 是无符号的意思,我们以 short 和 short int 来说明,short 就是有符号数,unsigned short 是 无符号数,但它们占的字节是相同的,则能表示的数的个数也是一致的,short 从 -32768~32767 一共 65536 个整数,unsigned 从 0 ~ 65535 不也是 65536 个整数吗
4.3 测试各种数据类型所占字节大小
计算字节大小,我们可以使用 sizeof(数据类型)
这个单目运算符
(sizeof(数据类型)不是函数哦,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义),它的返回值是括号内的数据类型的字节大小,在这里先简单使用一下,后面章节会详讲。不多说,上代码。
#include<stdio.h> int main() { //sizeof:计算()内数据所占内存空间大小,单位是字节。 printf("char = %d\n", sizeof(char)); //计算字符型字节大小 printf("short = %d\n", sizeof(short)); //计算短整型 printf("int = %d\n", sizeof(int)); //计算整型 printf("long = %d\n", sizeof(long)); //计算长整型 printf("long long = %d\n", sizeof(long long)); //计算更长整型 printf("float = %d\n", sizeof(float)); //计算单精度浮点型 printf("double = %d\n", sizeof(double)); //计算双精度浮点型 return 0; }
运行来看看结果吧:
❗️ 提一个问题:
📍 问题出在sizeof
上,它返回的是一个64位 (8 bytes
)的无符号整型
再看看我们使用的占位符 %d
,在格式化输入输出中代表int(4bytes
),%ld
代表long int(>=4bytes
), %lld
代表long long int (8 bytes
);
那你应该很清楚应该怎么改才能消除警告了吧,👇 修改后的代码
#include<stdio.h> int main() { //sizeof:计算()内数据所占内存空间大小,单位是字节。 //将 %d 修改为 %lld printf("char = %lld\n", sizeof(char)); //计算字符型字节大小 printf("short = %lld\n", sizeof(short)); //计算短整型 printf("int = %lld\n", sizeof(int)); //计算整型 printf("long = %lld\n", sizeof(long)); //计算长整型 printf("long long = %lld\n", sizeof(long long)); //计算更长整型 printf("float = %lld\n", sizeof(float)); //计算单精度浮点型 printf("double = %lld\n", sizeof(double)); //计算双精度浮点型 return 0; }
4.4 测试数据类型的取值范围
我们以 short 类型为例,在 4.2
提到它的取值范围为 -32768~32767 ,那就说明最大值是 32767,不能取 32768
📝 上代码测试:
#include<stdio.h> int main() { short temp1 = 32767; short temp2 = 32768; printf("temp1 = %d\n", temp1); printf("temp2 = %d\n", temp2); }
看下输出结果吧,可以看到temp2的值是超过了 short
的取值范围,因此输出temp2显示的不是我们定义的32768,而是负值
至于为什么是负值,这里不详说,涉及到底层的二进制运算,以后有机会单独拉出来解释。
5.变量、常量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型,张若昀对唐艺昕的爱)
有些值是可变的(比如:年龄,体重,薪资,渣男的爱)。
不变的值,C语言中用常量
的概念来表示,变得值C语言中用变量
来表示。
5.1 定义变量的方法
int age = 150; double weight = 45.5; char ch = 'w'; //我们也可以进行修改 age = 520; weight = 13.14;
5.2 变量的分类
5.2.1 介绍
1️⃣ 局部变量
- 也称为
内部变量
。局部变量是在函数内作定义说明的。其作用域仅限于函数内.离开该函数后再使用这种变量是非法的。 - 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是
平行关系
。 - 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元。互不干扰,也不会发生混淆。
- 在复合语句中也可定义变量,其作用域只在复合语句范围内。
2️⃣ 全局变量
全局变量也称为外部变量
,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。
3️⃣ 注意事项
如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。这就是我们以后会常提起的**就近原则**
5.2.2 实例演示
#include <stdio.h> int global = 2022;//全局变量,定义在main函数外部 int main() { int local = 2018;//局部变量 //下面定义的global会不会有问题? int global = 2020;//局部变量 printf("global = %d\n", global); return 0; }
这是不会有问题的,是允许全局变量与局部变量同名的,但如果在main函数中显示,显示的是2022还是2020呢?
根据就近原则
,printf(“global = %d\n”, global);也在main函数当中,说明局部的变量
离这条语句更近,因此显示的是 2020
5.3 变量的作用域和生命周期
1️⃣ 作用域
作用域(scope)
是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围。比如上述例子中的 local ,它是在main函数当中,因此它的作用域就是main函数内
- 全局变量的作用域是整个工程。比如上述例子中main函数外面的 global,它的作用域是所在的这个源文件。
2️⃣ 生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
现在你或许还不是很太理解,毕竟第一次接触,但等我们讲到函数还会继续讨论变量的作用域和生命周期。❤️
5.4 常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
这里我们先提 字面常量
与 const修饰的常变量
,后面两个以后再说。
5.4.1 字面常量
100;//字面常量 2.5;//字面常量 1;//字面常量
#include<stdio.h> int main() { //这个 100 就是字面常量,而a是变量 //我们相当于是把 字面常量100 赋值给了 变量a int a = 100; //我们可以对 变量a 进行修改 //变量a 原来的值是 100 ,现在我们 将字面常量 520 赋值给了 变量a a = 520; return 0; }