C语言是什么?
人和人交流使用的是自然语言,如:汉语、英语、日语。
那人和计算机是怎么交流的呢?人和计算机交流使用的是计算机语言,也就是C语言,Java,等计算机语言。目前已知有上千种计算机语言,人们通过计算机语言写的程序,给计算机下达指令。
C语言就是众多计算机语言中的一种。 C语言是一门面向过程的,抽象化的通用程序设计语言,广泛用于底层开发。
C语言的历史和辉煌
1969年,贝尔实验室的肯·汤普森与丹尼斯·里奇一起开发了Unix操作系统。Unix是用汇编语言编写的,为了移植到其他计算机,汤普森就在BCPL语言的基础上发明了B语言。(BCPL(Basic Combined Programming Language)是一种早期的高级语言,BCPL本身并没有被使用太长时间,这是因为它的后代们实在太强大了。1969年,汤普森在BCPL的基础上就改进出了B语言,用于书写Unix系统)
1972年,美国贝尔实验室的丹尼斯·里奇在B语言的基础上最终设计出了一种新的语言,它取了BCPL的第二个字母作为这种语言的名字,这就是C语言。(B语言取了BCPL的首字母)
1973年,C语言的主体完成。汤普森和里奇迫不及待地开始用它完全重写了Unix。
1982年,很多有识之士和美国国家标准协会(ANSI)为了使C语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。
1989年,ANSI发布了第一个完整的C语言标准----ANSI X3.159-1989简称“C89”,不过人们也习惯称其为“ANSI C”。C89在1990年被国际标准化组织(International Standard Organization,ISO)一字不改地采纳。ISO官方给予的名称为ISO/IEC 9899:1990,通常被简称为“C90”
至今,一直到今天C语言还是被广泛的使用,在计算机语言的排行榜上霸占前三名。
编译器
编译和链接
C语言是一门编译型计算机语言,C语言源代码都是文本文件,文本文件本身无法执行,必须要通过编译器翻译和链接器的链接,生成二进制的可执行文件。可执行文件才能执行
编译:编译器能够识别代码中的词汇、句子以及各种特定的格式,并将它们转换成计算机能够识别的二进制形式。要想在屏幕上面输出“HelloWorld”,计算机只能识别二进制数据也就是0/1,那么是不是就需要有个翻译的工具,把想让计算机执行的指令翻译给计算机。编译器这里就类似一个美国人(英语)和一个日本人(日语)对话,需要一个翻译员,来翻译美国人想要告诉日本人的话语。
链接:链接就类似炒菜,现在需要一盘辣椒炒鸡蛋,需要把辣椒、鸡蛋、调味料等,放在锅里按照指定的手法进行烹饪。出锅后就得到了一份辣椒炒鸡蛋。链接在这里主要起到将调料和食材汇聚在一起按照指定手法做成菜品的作用,它是将所有使用到的二进制形式目标文件和系统组件(库)合成一个可执行文件。
C语言代码是放在.c为后缀的文件中的,要得到最终运行的可执行程序,中间要经过编译和链接两个过程。
编译器的选择
常见的C语言编译器:
- msvc,Visual C++(简称MSVC)是由微软开发的,只能用于Windows操作系统;
- clang,Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器,支持Windows操作系统和Linux操作系统以及Unix操作系统
- gcc,GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)
集成开发环境(IDE)用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套件
常见集成开发环境(IDE)应用程序
- Microsoft Visual Studio(简称VS)(强烈推荐),集成了MSVC编译器。
- XCode,是运行在操作系统Mac OS X上的集成开发工具(IDE),集成了Clang编译器。
- CodeBlocks,是一个开放源码的全功能的跨平台C/C++集成开发环境(不推荐),集成了GCC编译器。
- DevC++,是一个 Windows 环境下的一个适合于初学者使用的轻量级 C/C++ 集成开发环境(IDE)(不推荐),集成了GCC编译器。
- Clion,是 JetBrains 推出的全新的 C/C++ 跨平台集成开发环境。支持Windows和Linux操作系统,有付费(暂时不推荐,并不适合初学者)。,默认使用CMake,编译器是可以配置使用MSVC,Clang,GCC等编译器。
tips:VSCode并不是集成开发环境, VSCode是一个编辑器,只不过可以通过扩展实现集成开发环境的功能。
源文件和头文件介绍
C语言中把.c为后缀的文件成为源文件,把.h为后缀的文件称为头文件
源文件:文件是指由创建者所定义的、具有文件名的一组相关元素的集合。源文件一般指用汇编语言或高级语言写出来的代码保存为文件后的结果,源文件是相对目标文件和可执行文件而言的。
头文件:在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件和定义文件组成。头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明,而定义文件用于保存程序的实现。
第一个C语言程序
#include <stdio.h>//引入包含printf函数的头文件
int main()
{
printf("HelloWorld!!!");
return 0;
}
这里使用VS2022集成开发环境。这个时候按Ctrl+F5就可以在命令行窗口输出HelloWorld!!!
main函数
每个C语言程序不管有多少行代码,都是从main函数开始执行的,main函数是程序的入口,main函数也被叫做:主函数。main前面的int表示main函数执行结束的时候返回一个整型类型的值。所以在main函数的最后也要写上return 0;代表返回0。正好前后呼应
- main函数是程序入口
- main函数有且仅有一个
- 即使项目有多个.c文件,但是只能有一个main函数(因为程序入口只能有一个)
tips:在代码的书写中一定要使用英文的标点符号以及非注释不要使用中文字符
printf函数
printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf 是C语言标准库函数,定义于头文件 <stdio.h>。所以上方代码需要引入stdio.h头文件。(stdio是standard input&output的简称,标准输入输出头文件)
功能:在屏幕上打印信息
上面的代码是使用printf函数打印字符串(HelloWorld!!!)。只要把想要打印的一串字符串放在双引号(“”(切记是英文双引号))中并传递给printf函数就可以打印到屏幕上。
printf函数也可以用来打印其他类型的数据,比如:
int n = 100;
printf("%d\n", n); //printf打印整型
printf("%c\n", 'q'); //printf打印字符
printf("%lf\n", 3.14);//printf打印双精度浮点型
这里的%d,%c等占位符,会被后边的值替换。
什么是库函数
库函数(Library function)是将函数封装入库,供用户使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。调用的时候把它所在的文件名用#include<>加到里面就可以了。
C语言的库函数并不是C语言本身的一部分,它是由编译程序根据一般用户的需要编制并提供用户使用的一组程序。C的库函数极大地方便了用户,同时也补充了C语言本身的不足。事实上,在编写C语言程序时,应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量。
为了不再重复实现常见的代码(比如printf函数,不能每个人想要实现打印字符串到屏幕上的功能都重新编写一个printf函数),让程序员提升开发效率,C语言标准规定了一组函数,这些函数再由不同的编译器厂商根据标准进行实现(printf函数可能在msvc和gcc的实现方法是不一样的),提供给程序员使用。这些类似的函数有很多,就组成了一个函数库,被成为标准库,这些函数也被成为标准库函数,简称库函数。
C语言关键字
auto :声明自动变量
break:跳出当前循环
case:开关语句分支
char :声明字符型变量或函数返回值类型
const :声明只读变量
continue:结束当前循环,开始下一轮循环
default:开关语句中的“默认”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义
float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型
register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数)
short :声明短整型变量或函数
signed:声明有符号类型变量或函数
sizeof:计算数据类型或变量长度(即所占字节数)
static :声明静态变量
struct:声明结构体类型
switch :用于开关语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针
volatile:说明变量在程序执行中可被隐含地改变
while :循环语句的循环条件
tips:sizeof是关键字,切记!切记!切记!sizeof是关键字不是库函数。在C99标准中加入了inline,restrict,_Bool,_Comploex,_Imaginary等关键字。最多使用的还是上面代码区的关键字
- 关键字都有特殊意义,是保留给C语言使用的
- 程序员自己在创建标识符的时候是不能和关键字重名的(重复的)
- 关键字也是不能自己创建的。
字符和ASCII编码
字符
在键盘上可以敲出各种字符,如a,q,@,#等,这些符号都被称为字符,C语言中字符使用单引号("切记是英文单引号)括起来的。
我们知道在计算机中所有的数据都是以二进制的形式存储的。如果每个人自己给这些字符中的每个字符编一个二进制序列,这叫做编码。为了方便大家相互通信,不要造成混乱,后来美国国家标准学会(ANSI)出台了一个标准ASCII编码,C语言中的字符就遵循了ASCII编码的方式。
没有标准会出现什么情况?
这就好比以前战争时期的密码本一样,如果总部和我各持有一个不一样编码的密码本,那么我发送的信息是不是总部就无法解析出正确的话语呢。
ASCII码表参考链接:百度百科-ASCII码表
单个字符要打印到屏幕上使用%c占位符用printf函数输出到屏幕上。
printf("%c",'q');//输出q
printf("%c",65);//输出A
两种打印字符的方法
字符串和\0
字符串顾名思义是一串字符。C语言中是没有字符串这个类型的。通常使用%s占位符使用printf函数输出到屏幕上。
C语言中的字符串有一个特殊的知识,就是在C语言中字符串的末尾是隐藏放着一个\0字符的,这个\0字符是字符串结束标志。
从上方的VS2022监视可以看到字符串HelloWorld在内存中是有11位字符的。在末尾有一个\0。
\0转义字符。主要用来告知计算机字符串结尾的。因为C语言没有字符串这个类型所以如果没有\0计算机在内存中无法分辨字符串到哪里结束了。而且也可以发现字符串在C语言中是以char类型的多个字符加上\0组合成字符串的。也可以认为没有\0的不是字符串。但是有\0的不一定是字符串,有可能是字符数组。
转义字符
在上面知道了\0是一个转义字符,在上面的代码也可以发现\n这样的转义字符,转义字符:转变原来的意思的字符。
举例:
#include <stdio.h>//引入包含printf函数的头文件
int main()
{
printf("abcndef\n");//在末尾添加加转义字符
printf("abc\ndef");//在字符n前面加上\使n变为转义字符\n
return 0;
}
输出结果:
运行上面的代码输出结果我们发现\n这个转义字符实现了换行的效果,在字符n前面加上\就实现了换行的效果。这样就是将字符n转变原来的意思,变为换行。
C语言转义字符参考链接:百度百科-转义字符
特殊转义字符:\ddd 1-3位8进制数所代码的任意字符
\xhh 16进制所代表的任意字符
#include <stdio.h>//引入包含printf函数的头文件
int main()
{
printf("\101\n");//输出字符A,101是字符A所对应的8进制,\n换行
printf("\x41\n");//输出字符A,41是字符A所对应的16进制,\n换行
printf("\105\n");//输出字符E,105是字符E所对应的8进制,\n换行
printf("\x47\n");//输出字符G,47是字符G所对应的16进制,\n换行
return 0;
}
tips:转义字符是一个字符,不是两个字符,也不是一个字符串。是一个字符。也就是在ASCII编码表里面有定义
C语言语句和语句分类
C语言的代码是由一条一条的语句构成的,C语言中的语句可为以下五类:
- 空语句,空语句是最简单的,一个分号就是一条语句,是空语句。
while { ;//空语句 }
- 表达式语句,就是在表达式的后边加上分号。
5+3;//表达式语句,<表达式>;
- 函数调用语句,函数调用的时候也会加上分号,就是函数调用语句。
printf("HelloWorld!!!");//函数调用语句,<函数(参数)>;
- 复合语句,成对括号({}大括号)中的代码就构成一个代码块,也就是复合语句。
int main() { for(;;) { ;//空语句 }//复合语句 }//复合语句
- 控制语句,用于控制程序的执行流程,以实现程序的各种结构方式(C语言三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。可以分为一下三类:1.条件判断语句也叫分支语句:if语句,switch语句; 2.循环执行语句:do while语句、while语句、for语句; 3.转向语句:break语句、goto语句、continue语句、return语句。
注释
注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。
注释是给程序员自己,或者其他程序员看的
好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。
当然不写注释可能会让后期阅读代码的人抓狂。
写注释一定程度上反应了作者的素质,建议大家写必要的注释。
注释的两种形式
C语言注释/**/ 将注释放置在/**/的中间(/*注释的内容*/),内部可以分行。但是无法嵌套注释
C语言注释// 将注释放置在//后面(//注释的内容),从双斜杠到行尾都属于注释。这种注释只能是单行,可以放在行首,也可以放在一行语句的结尾,这是C99标准新增的语法。
请合理利用上方两种注释形式。
tips:不管是哪一种注释,都不能放在双引号里面(“//,/**/”,错误的使用),双引号里面的注释符号,会成为字符串的一部分,解释为普通符号或者转义字符,失去其注释的作用。计算机中的注释在编译的时候不是删除也不是不管,而是替换为一个空格,就是将单个注释形式的内容替换为一个空格,而不是删除,切记不是删除!