C语言基础(1)
1.编译器的选择
我们的c语言是一门,我们写的c语言代码是文本文件(存放在.c为后缀的文件中),文本文件本身无法被执行,必须通过编译器的编译和链接器的链接,生成可执行的二进制文件,才能够被执行
注意:
- 每个源文件(.c文件)通过编译器生成目标文件(后缀为.obj的文件)
- 多个目标文件和库文件通过链接器生成可执行文件(.exe文件)
3.一个工程里面一般会有多个源文件组成
编辑器和集成开发环境的区别
前面说到了我们c语言是一门编译型的语言,需要编译器将其转换成机器能够执行的机器指令
编译器
msvc,gcc,clang是常见的编译器
集成开发环境(IDE)
- 集成开发环境一般包含代码编辑器,编译器,调试器和图形用户界面等,集成了代码编写功能,分析功能,编译功能,调试功能等一化的开发软件服务套
- vs2022,XCode,CodeBlocks,Devc++都是常见的集成开发环境
vs2022集成了msvc,安装包大一些,安装简单,无需多余配置,用起来很方便
XCode集成了clang,是苹果电脑上的工具
CodeBlocks集成了gcc,这个工具需要配置,比较小众
Devc++集成了gcc,小巧,但是工具过去简单,对代码风格的养成不好,通常是一些竞赛在使用
2.main函数
每个c语言程序不管是有多少行的代码,都是从main函数开始执行的,main函数是程序的入口,main函数前面的int表示函数结束的时候要返回一个整型类型的值,所以在main函数的最后写return 0,正好前后呼应
- main函数是程序的入口
- main函数有且只能有一个
- 即使是一个项目里面有多个.c文件,也只能有一个main函数(因为程序的入口只有一个)
main函数的写法
- 这是main函数过去的写法
- void表示main函数不接受任何的参数
- 有参数的main函数
如果不想使用main函数的参数,可以不写,这些参数就是多余的,等到需要的时候再写
3.printf和库函数
printf函数
printf是一个库函数,功能是在标准输出设备上(一般指屏幕)上进行信息的打印
库函数
为了不再重复实现常见的代码,提高程序员的开发效率,c语言标准规定了一组函数,这些函数由不同的编译器实现,供程序员使用,这些函数组成了一个库叫做标准库,这些函数也被称为库函数
一个系列的库函数一般会声明在同一个头文件里面,所以库函数的使用,要包含对应的头文件,比如stdio.h文件里面就是关于标准输入输出的函数
4.字符和ASCII编码
在键盘上可以敲出各种的字符,a,@,#等都是字符,c语言中字符用单引号引起来,我们都知道我们的数据是以二进制的形式存储的,我们一般会给字符进行二进制编号,给每一个字符编一个二进制序列,这就叫做编码
但是每个人对字符进行编码的序列会因人而异,为了统一,不造成混乱,美国国家标准学会出台了一个标准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的这31个字符是不可打印字符,无法在屏幕上观察
5.字符串和\0
在c语言中字符串是用双引号引起来的,字符串的打印格式是%s
在c语言的字符串中,字符串比较特殊,在字符串的末尾隐藏着一个\0,是字符串结束的标志,函数printf和strlen都是根据\0来判断字符串是否结束的
如上图我们以这种方式创建字符串,后面是有\0的
如果用上图的方法来创建字符串的话就没有隐藏的\0,于是这种情况在使用printf函数的时候,就会打印出一段乱码才会停下,因为此字符串没有\0,printf不知道字符串什么时候结束,直到打印到内存中其他的\0的位置才能停下(如下图)
如果我们手动的给这个字符串加上\0的话,问题也就被解决了
如果我们打打印字符串的时候字符串的中间有\0的话,字符串的打印也会提前结束(如下图)
6.转义字符
转移字符顾名思义就是转变原来字符的意思
比如我们的字符n,原来的意思就是一个简单的字母n,前面加上\了以后,就转变了原来的意思,变成换行的意思了
转义字符 | 作用 |
---|---|
\? | 在书写多个问号的时候,防止他们被解析成三字母词,比如我们要打印( are you ok??)的时候,??)就会被解析成],于是我们就在?的前面加上/,于是就将三字母词里的问号转化成了一个普通的问号,在这里问号的意思被转变了(如下图)![]() |
\’ | 表示字符常量‘,当我们想要打印一个’的时候,三个‘的时候会报错,我们希望前后两个’组成一队,打印中间的‘,但是实际上前两个’会组成一对,把最后一个‘剩下,于是程序就报错了,所以我们需要中间的’只表示单纯的字符,而不是字符两边的单引号![]() ![]() |
\” | 跟单引号是同理的 |
\\ | 用于表示一个反斜杠,防止它被解析成转移字符![]() ![]() ![]() |
\a | 警报,这会使得终端发出警报声或者出现闪烁,或者两者同时发生 |
\b | 退格符,光标回退一个字符,但是不删除字符 ![]() ![]() |
\r | 回车符,光标会移动到同一行的开头,同样的我们输入一个字符同样也会将这一行的第一个字符给覆盖掉![]() |
\t | 制表符,光标移动到下一个水平制表符位,,也就是移动到下一个\t长度的倍数处,通常是4\8的倍数 |
\ddd | ddd表示一到三哥八进制的数字,表示将ddd转换成十进制在ASCII表里面对应的字符,如\130就代表字符x![]() |
\xdd | dd表示两个十六进制数字,表示将dd转化为十进制在ASCII表里面对应的字符,比如\x30表示0![]() |
\0其实是\ddd类的转义字符,0转换为十进制也是0,对应的ASCII表里面编号为0的字符,但是由于\0标志着字符串的结束,所以0编号处的字符是不存在的,是空的
7.注释
在编译的时候,注释会被替换为空格,比如min/*这是一个注释*/Value在编译之后会变成min Value,而不是minValue