1967年,26岁的丹尼斯·里奇进入贝尔实验室开发Unix,并于1969年圣诞节前推出第一个试运行版本,但由于这个时候的Unix是汇编语言写的,移植性非常差,想要让Unix运行在不同型号的机器上,就得针对每个型号的机器重写一遍操作系统,这显然是一个不可能完成的任务。

为了提高通用性和开发效率,丹尼斯·里奇决定发明一种新的编程语言 ---- C语言。紧接着,丹尼斯·里奇就用C语言改写了Unix操作系统Unix上的C语言编译器,他的同事汤姆森则使用C语言重写了Unix,使它成为一种通用性强、移植简单的操作系统,从此开创了计算机编程史上的新篇章,C语言也成为了操作系统的专用语言。
对于大部分程序员来说,C语言是学习编程的第一课,C语言除了能让你了解编程的相关该概念,还能够让你明白程序的运行原理,比如:计算机的各个部件是如何交互的,程序在内存中是一个怎样的状态,操作系统和用户程序之间的爱恨情仇。
C语言是一种用途广泛、功能强大、使用灵活的过程性编程语言(不同于面向过程的语言如C++、Java),既可用于编写应用软件,又可用于编写系统软件;
C语言属于编译语言,编译语言,源程序需要经过编译器把代码全部翻译为机器语言0-1二进制的可执行程序,一旦翻译以后,只要源程序不变,就不需要再次进行编译;不同于Python这类解释型语言,解释型语言则是将源程序的一条一条的代码翻译成机器语言后立即执行,翻译一条执行一条,翻译一次只能执行一次,当第二次运行时就要重新翻译,所以效率不高。
C语言有以下特点:①语言简洁、紧凑,使用方便、灵活;②运算符丰富;③数据类型丰富;④具有结构化的控制语句;⑤语法限制不太严格;⑥允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作;⑦编写的程序可移植性好;⑧生成目标代码质量高,程序执行效率高;因为贴近底层且执行效率极高故C语言成为了计算机开发人员的一项基本功。
C语言可以说是有史以来最为重要的编程语言,更是入门级语言,学习C语言是了解内存布局的最简单、最直接、最有效的途径。C语言简直是为内存而生的,它比任何一门语言都贴近内存。所熟知的PHP、Python等都是用C语言开发的。
C89 和 C99 标准
到了80年代,C语言越来越流行,广泛被业界使用,为统一C语言版本,1983年美国国家标准局(American Nation Standards Institute,简称 ANSI)成立委员会专门制定C语言标准,1989年C语言标准被批准,被称为 ANSI X3.159-1989 " Programing Language C" 。这个版本的C语言通常被称为 ANSI C,又由于这个版本是在89年完成指定的,因此也称 C89 。后来 ANSI 把这个标准提交到 ISO(国际化标准组织),1990年被ISO采纳为国际标准,称为 ISO C ,又因为是1990年发布的,所以也称 C90,ANSI C(C89)和 ISO C(C90)内容基本相同,主要格式组织不一样,所以这两个标准的内容是一样的。
C99 标准
在 ANSI C 标准确立之后, C 语言的规范在很长一段时间内都没有大的变动。1995年 C 程序设计语言工作组对 C 语言进行了一些修改,增加了新的关键字,编写了新的库,取消了原有的限制,并于1999年形成新的标准 ISO / IEC 9899:1999标准,通常被成为C99。
C11 标准
C11标准由国际标准化组织( ISO )和国际电工委员会( IEC )旗下的 C 语言标准委员会于2011年底正式发布,C11标准主要增加了以下内容:
●增加了安全函数,例如 gets _s0、 fopen _s0等;
●增加了< threads . h >头文件以支持多线程;
●增加了< uchar . h >头文件以支持 Unicode 字符集;以及其它一些细节。
现在的很多教程或教材都是基于C89编写的,后来的C99、C11新增的特性并不多,只是在“打补丁”。
#include // 编译预处理指令(头文件)
int main() // 定义主函数 int为返回值类型
{ // 花括号{}内的是函数体
printf("Hello World); // printformat 格式化输出
return 0; // 返回0 代表函数执行完毕
}
程序分析:
- main是函数的名字,表示“主函数”,每一个C语言程序都必须有一个main函数;
- main前面的 int 表示此函数的返回值类型为 int 即整形;
- return 0 ; 的作用是当main函数执行结束前将整数0作为函数值返回到调用处;
- 函数体由花括号 { } 括起来;
- 带括号的语句称为函数(function) ,如 printf() puts() 都是函数;
还可以这样:
#include // 编译预处理指令(头文件)
int main() // 定义主函数 int为返回值类型
{ // 花括号{}内的是函数体
puts("Hello World); // 输出字符串
return 0; // 返回0 代表函数执行完毕
}
运行后出现以下:

必须使用英文半角输入法,尤其是标点符号!
#include //编译预处理
int main() //主函数
{
int a, b, sum; //声明,定义a,b,sum为整形变量
a = 123; //给a赋值,已经声明过所以前面不用加
b = 123; //给b赋值
sum = a + b; //把a和b的值累加赋给sum
printf("%d + %d = %d",a,b,sum);//%d为格式占位符 传递后面变量的值
return 0; //返回0 函数执行结束
}
#include //头文件
int main() //主函数
{
int max(int x, int y); //声明一个自定义函数
int a=0, b=0, c; //声明a,b,c 因为我用的VS2022所以需要初始化,不然会报错
scanf_s("%d %d", &a, &b); //scanformat格式化扫描输入 &a为a的地址
c = max(a, b); //调用自定义函数max来比较出大小
printf("max=%d", c); //输出 %d 为占位符
return 0; //主函数执行结束
}
int max(int x, int y) //自定义函数 括号内的为形参
{
int z; //声明z来接收最大值
if (x > y)z = x; //如果x>y则把x赋给z
else z = y; //否则y赋给z
return (z); //返回z的值到调用这个函数的地方
}
- 在main主函数里声明自定义函数(声明就是先告诉程序有这个函数,不要报错,继续执行到调用这个函数时,程序会自动去找到定义的部分)
- 自定义函数 int max( int x , int y ) 最前面的 int 是这个函数的返回值类型,括号里的 int x 和 int y 是声明的形参,就是开辟了一个内存空间占位置,等待数值传递进来;
- scanf 是 scan formar 格式化扫描,能够读取用户输入的数据,在VS2022里面用这个会报错,用 scanf_s 代替scanf,且扫描的参数需要初始化;
- “ %d ” 是格式占位符,含义是“以十进制整数的形式输出”
- “ & ” 是地址符,“ &a ” 含义是“ 变量a的地址 ”,就和形参一样,先告诉程序这个位置会有读取的数值传递进来,先声明占位。

一个程序由一个或多个源程序文件组成;
函数是C程序的主要组成部分;
一个函数包括两个部分:
函数首部:int max ( int x, int y ) ; int main( void );
函数体:最外层花括号内的部分;
程序总是从main函数开始执行的,其他自定义函数也在main函数种被调用执行;
每个数据声明和和语句的最后必须有一个分号;
C语言本身不提供输入输出语句,输入输出的操作是由#include
好的程序应该包含注释,增加程序可读性;
什么是头文件?
#include
引入头文件用#include命令,并将文件名放在<>中,#include和< >之间可以有空格;头文件以.h为后缀,而C语言代码文件以.c为后缀,它们都是文本文件,没有本质上的区别,#include命令的作用也仅仅只是将头文件中的文本复制到当前文件,然后和当前文件一起编译。
较早的C语言标准库包含了15个头文件,stdio.h 和 stdlib.h 就是最常用的两个;
① stdio 是 standard input output 的缩写,stdio.h 为“标准输入输出文件”,包含的函数大多都和输入输出有关;
② stdlib 是 standard library 的缩写, stdlib.h 为“标准库文件”,包含的函数比较杂乱,多是一些通用工具型函数,如 system();

C语言不总是白底黑字的,也可以是彩色的,可以通过调用 windows.h 头文件下的 SetConsoleTextAttribute 函数来改变文字和背景的颜色,调用形式为:
SetConsoleTextAttribute ( HANDLE hConsoleOutput, WORD wAttributes );
0 ~ F 分别代表的颜色如下:
0 = 黑色 4 = 淡红 8 = 灰色 C = 红色
1 = 淡蓝 5 = 紫色 9 = 蓝色 D = 淡紫
2 = 淡绿 6 = 黄色 A = 绿色 E = 淡黄
3 = 湖蓝 7 = 白色 B = 淡绿 F = 亮白
例如:将背景设为淡绿色,文字颜色设为红色:
#include
#include
int main()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, 0x2c);//0x代表十六进制 2是淡绿背景,c是红色字体
puts("I love C code");
SetConsoleTextAttribute(hConsole, 5);//将文字设为紫色
puts("I love Chengdu");
SetConsoleTextAttribute(hConsole, 0xe);//将文字设为淡黄
printf("!!!");
return 0;
}
C语言不仅可以编写黑色的控制台程序,还可以编写带界面的Windows程序(GUI程序):
#include
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
) {
int nSelect = MessageBox(NULL, "Hello World!", "This is C Program", MB_OKCANCEL | MB_ICONEXCLAMATION);
return 0;
}
// 不需要看懂,只是作为展示
输出:
