自我介绍
大家好,Loaf。
这是我的第一篇技术博客,还是以 “C 语言” 学习为主题。
我是一名 DBA,从事了多年数据库相关工作,我虽然是计算机专业出身,不过在大学里一行代码都没有写过,但是我一点都没有骄傲。
说起 Loaf 这个网名,我不知道是什么时候开始就存在于我的网络世界中,甚至此刻我都不知道这是什么意思,所以我特意查了一下:
按名词解释就是“一条面包”,按动词解释就是“游手好闲”?组合一下动名词就是“游手好闲的面包”?那就用这个吧。
之前写过几篇微信公众号,不过因为各种原因并没有坚持下来。随着工作年限的增加,感觉到了某种瓶颈,为提高自身的技术能力,虽然在看书学习,但对于底层原理性的东西,吸收率不是太好,所以我就想到了学习 “C语言”这门“古老”而又难入门的语言,我也相信一定能学好。借着这个势头,将开启我的“C语言之旅”,也决定坚持写博客。
今天是学习”C语言“的第一天,主要了解”C语言“是什么。
C 语言是什么?
简单来说,C 语言就是一门编程语言(好正确的废话)。但是这并不重要,在我的认知中,编程语言也好,数据库也罢,归根结底都是为了解决某个问题。
C语言最初是作为 Unix 系统的开发工具而发明。发明至今,虽有一定年限,不过在开发语言榜单上的热度,依旧是 TOP 5 的存在,而且我认为,想要彻底了解计算机底层原理,C语言是个很不错的切入点。
源文件
什么是源文件?
简单理解就是存储代码的文件,就叫源文件。
每种语言都有特定的文件后缀,方便编译器识别,常见的文件后缀:
- C语言源文件的后缀是
.c
; - C++语言(C Plus Plus)源文件的后缀是
.cpp
; - Java 源文件的后缀是
.java
; - Python 源文件的后缀是
.py
; - JavaScript 源文件后置是
.js
。
编译和链接
C语言是一门编译型计算机语言,编写完代码保存的文件叫源文件,源文件是无法被计算机读取并运行的。因为计算机只识别二进制。所以需要把代码转换成计算机可以识别并能成功运行的程序。
在 Windows 中常见的如 .exe
结尾的文件就叫可执行程序,双击即可运行。当然在 Linux 中并没有这种要求,Linux 一切皆文件,格式并不重要,但是为了可读性,规范文件后缀是有必要的。
那么从源文件到生成可执行程序,就要经过编译、链接这个过程。首先通过编译会把源文件转换成CUP可识别的二进制形式, 此时并没有生成可执行程序 .exe
,而是生成叫做目标文件(Object file),不同的编译器产生的文件后缀会有所不同,如Visual C++生成的后缀为.obj
;GCC 产生的目标文件后缀是.o
。
目标文件经过链接后,就会生成可执行程序。
那么既然在编译阶段已经生成了CUP可以识别的二进制文件,为什么还要继续做链接呢?因为编译只是把我们写的代码转换成了CUP可以识别的二进制文件,但是一个程序运行,需要依赖库,系统库,系统函数等多个因素,所以需要在链接阶段继续把这些打包生成可执行程序。
结论就是,我们编写的代码想要执行,必须经过[编译-->链接]这个过程。
注:
每个源⽂件(.c)单独经过编译器处理⽣成对应的⽬标⽂件(.obj为后缀的⽂件)
多个⽬标⽂件和库⽂件经过链接器处理⽣成对应的可执⾏程序(.exe⽂件)
头文件
前面已经介绍了源文件、编译以及链接,那么接下来看一下头文件。
我还记得大学时学习C语言,上来第一件事情就是写一行代码:
#include
当时根本就不知道这是什么,也没有去研究这是什么,为什么会在这里,他有什么作用,是不是必须的。。。:smile:
通过今天的学习才知道,这就是头文件。头文件以.h
结尾。具体作用会在下面介绍。
我的第一个C语言程序
#include
int main() //主函数
{
printf("Hello Cn");
return 0;
}
IDE 我使用的是 Visual Studio 2022;对于初学者来说,建议使用这个。VS 除了安装包大一点,只要安装成功就可以开始 C 语言编程之旅。
其他的一些 IDE 软件,可能需要做调试,并且安装插件才可以跑C语言代码。
代码运行成功,内心非常激动。
代码解释:
#include //这就是头文件,作用就是引用C语言自带的一些库函数,否则我们无法使用类似`printf()`这类函数
int main() //主函数
{
printf("Hello Cn"); //打印函数,可将Hello C 打印纸屏幕,n 为换行符
return 0; //潜规则,默认都会带上。
}
{ } 表示函数主体部分
main函数
main 是C语言的入口,不管有多少行代码,都是从main函数开始执行。
main函数也叫做主函数,我们使用 int 定义了main函数,所以函数执行结束时需要返回整形类型的值,所以 return 0
刚好对应。
- main 函数是主函数,也是函数的入口
- 在一个项目中,main函数必须有,且只有一个。
printf函数
代码中使⽤了 printf
函数,实现了在屏幕上信息的打印。
在之前的代码中,printf
打印了字符串,其实printf也可以打印其他类型的数据
int n = 100; //定义并初始化变量
printf("%dn", n); //printf打印整型
printf("%cn", 'q'); //printf打印字符
printf("%lfn", 3.14); //printf打印双精度浮点型
%d
、%c
是占位符,会被后边的变量代替。第一位表示占位符,第二位表示占位符类型;如%d
表示整型,%c
表示字符。
printf 函数打印需要包含stdio.h
头文件。
关键字
C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键字。
- 关键字都有特殊的意义,是保留给C语⾔使⽤的
- 程序员⾃⼰在创建标识符的时候是不能和关键字重复的
- 关键字也是不能⾃⼰创建的。
C语言中32个关键字:
auto break case char const continue default do double else enum ex
float for goto if int long register return short signed sizeof
struct switch typedef union unsigned void volatile while
参考:zh.cppreference.com/w/c/keyword
字符和ASCII编码
'a'、'b'、'c'、'd' 这一类都叫做字符,C语言中使用单引号括起来。单个字符打印可以使用%c
占位符。
==ASCII 是“American Standard Code for Information Interchange”的缩写,翻译过来是“美国信息交换标准代码”==
我的理解,ASCII就类似字典表,因为计算机只是别二进制,所以将各种符号以及字幕锁对应的二进制转换成十进制数字存储,方便我们查阅。
ASCII编码表
- 字符A ~ Z的ASCII码值从65~90
- 字符a ~ z的ASCII码值从97~122
- 对应的大小写字符(a和A)的ASCII码值的差值是32
- 数字字符0 ~ 9的ASCII码值从48~57
- 换⾏ n 的ASCII值是:10
- ==在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察==
看一段代码:
int main()
{
printf("%cn", 'Q');
printf("%cn", 81);//这⾥的81是字符Q的ASCII码值,也是可以正常打印的
return 0;
}
执行结果:
打印所有字符展示:
int main()
{
int i = 0;
for (i = 32; i