C语言教程第一节


1 计算机语言

计算机语言总的来说分为机器语言,汇编语言,高级语言三大类。

1.1 机器语言

1946年,世界上第一台计算机ENAC诞生,使用的是最原始的穿孔卡片。这种卡片上使用的语言是只有专家才能理解的语言,与人类语言差别极大,这种语言就称为机器语言。 当时的程序都由“0”和“1”组成的,编写程序只能通过“打孔”来实现。

0001,0001,000000010000 代表 STORE B, 16

1.2 汇编语言

汇编语言用助记符代替了操作码,用地址符号或标号代替地址码。简单来讲就是,使用符号代替了机器语言的二进制码。 比如:

MOV AL,5

1.3 高级語言

高级语言发展于20世纪50年代中叶到70年代,它是一种接近于人们使用习惯的程序设计语言。它允许用英文写计算程序,程序中的符号和算式也与日常用的数学式子差不多。

现在,计算机语言仍然在不断的发展,种类也相当多,比如 C语言C++JavaC#PythonPHPJavaScriptGo语言、Objective-C、Swift、汇编语言等 。

C语言代码如下:

int a = 520;

了解更多历史发展:https://blog.csdn.net/abc6368765/article/details/83990756

1.4 关于编程语言

我们每天都在使用计算机,无论是桌面计算机还是智能手机,其实都是某种形式的计算机。要用计算机做某件事情,就需要使用某个具体的应用软件。这些应用软件都是用某种编程语言写出来,告诉计算机要如何为我们做事情的。编程语言就是用来描述我们要计算机如何做事情的语言。

计算机和人脑完全不一样,计算机有自己的思维方式和行为习惯。所以有的事情人类很容易就做到了,计算机可能会很困难;而有的事情人类不擅长或者不乐意做,计算机却可能会很容易实现。学习编程就需要了解计算机做事情的方式方法,学会用计算机的方式来想问题,这就叫做计算思维。

在学习编程语言的时候语法只是基础,编程思想、方法才是掌握一门语言的关键,也可以说是 逻辑思维能力 。

2 C语言的背景

2.1 C语言的发展历史

20世纪60年代,贝尔实验室的研究员Ken Thompson(肯·汤普森)发明了B语言,并使用B编了个游戏 - Space Travel,他想玩自己这个游戏,所以他背着老板找到了台空闲的机器 - PDP-7,但是这台机器没有操作系统,于是Thompson着手为PDP-7开发操作系统,后来这个OS被命名为 UNIX。

1971年,Ken Thompson的同事D.M.Ritchie(DM里奇),也很想玩Space Travel,所以加入了Ken Thompson,合作开发UNIX,他的主要工作是改进Thompson的B语言。

最终,在1972年这个被改进的新语言被称为C,取BCPL的第二个字母,也是B的下一个字母。

1973年,C主体完成。Ken Thompson和D.M.Ritchie迫不及待的开始用C语言完全重写了UNIX。

以下是有关C语言的发展历史:

CPL(Combined Programming Language) - 1963
CPL是1963年剑桥大学发明的

BCPL(Base Combined Programming Language) - 1967
剑桥的Matin Richards 对CPL做了简化,推出了BCPL

B(B Programming Language) - 1969
贝尔实验室的Ken Thompson(肯·汤普森) 对BCPL又做了改进,设计出了简单的且接近硬件的B语言,并用B语言写了第一个UNIX OS

C(C Programming Language) - 1972
贝尔实验室的另外一个人Dennis MacAlistair Ritchie(D.M.Ritchie - DM里奇)在B的基础上设计出了C语言。C 保持了B的优点(精炼、接近硬件),又克服了他的缺点(过于简单,数据无类型)

C++(C plus plus Programming Language) - 1983
还是贝尔实验室的人,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普) 在C语言的基础上推出了C++,它扩充和完善了C语言,特别是在面向对象编程方面。一定程度上克服了C语言编写大型程序时的不足。

2.2 C语言的标准

语言肯定会有标准化的东西,就比如普通话也是有标准的,但是就像普通话一样我们并不用过度在意这个标准,你只要知道 C语言标准的最新版本是2011年的C11,但是目前编译器支持得最好的是1999年的C99 就够了。

因为不同的标准,语法规定会有些许的不同。

2.3 C语言会不会落后了?

这是2019年11月的编程语言排名

在这里插入图片描述
可以见得C语言作为众多程序员入门的第一门语言还是依然保持着热度。

2.4 C语言能干什么

C/C++主要用于PC软件开发、Linux开发、游戏开发、单片机和嵌入式系统。

C语言在工业界有重要的地位,在很多领域无可替代,几乎所有和硬件打交道的地方都得要用C语言。

可以利用C语言写操作系统(上面讲到的UNIX就是了)、开发嵌入式系统(像智能音箱就是嵌入式)、还可以开发底层驱动(比如图形引擎、图像处理、声音效果等)、开发其他语言

但是我们平时使用的软件就都不是使用C语言写的。

  • PHP、Python 等都是用C语言开发出来的,虽然平时做项目的时候看不到C语言的影子,但是如果想深入学习 PHP 和 Python,那就要有C语言基础了。
  • C++ 和 Objective-C 干脆在C语言的基础上直接进行扩展,增加一些新功能后变成了新的语言。
  • 在开发的时候很多时候是使用工具,就像如果你想要烤一个面包要怎么办,肯定用烤箱呀,总不可能自己造的吧,就算你能造,已经有的东西,直接拿来用效率多高。然后你要怎么使用,肯定是看说明书啦,如果是外国进口的烤箱,你学会了英文就能看懂该怎么操作了,然后自己就可以操作了。这也就是我们学习C语言的目的,很大程度在希望能够看懂“说明书”,然后会自己使用“工具”。

2.5 C语言的特点

  • 编程概念少,附带的标准库小,所以整体比较简洁,容易学习,非常适合初学者入门
  • 是面向过程的编程语言,已经脱离了计算机硬件,可以设计中等规模的程序
  • 操作相对底层,代码执行效率很高,速度快(python的机器视觉库很多为了追求效率都是使用C语言写的然后封装起来,所以你看不到)
  • 开发大工程效率较低(后来人们又在C语言的基础上增加了面向对象的机制,形成了一门新的语言,称为C++)

2.6 怎么学习C语言

这是一个没有答案的问题。每个人投入的时间、学习效率和基础都不一样。如果你每天都拿出大把的时间来学习,那么两三个月就可以学会C/C++

但是有一点可以肯定,几个月从小白成长为大神是绝对不可能的。要想出类拔萃,没有几年功夫是不行的。学习编程不是看几本书就能搞定的,需要你不断的练习,编写代码,积累零散的知识点,代码量跟你的编程水平直接相关,没有几万行代码,没有拿得出手的作品,怎能称得上“大神”。

每个人程序员都是这样过来的,开始都是一头雾水,连输出九九乘法表都很吃力,只有通过不断练习才能熟悉,这是一个强化思维方式的过程。

重点在于多上机练习!!!

2.7 额外的话

  1. 大学里的学习是一件长期的事情,每天花个半小时学一下编程也不算很多的。一年是一个分水岭,一年之后你就可以看到同学之间的差距了。
  2. 英语还是很重要的,不过是专业英文。 如果你希望达到很高的造诣,希望被人称为“大神”,那么肯定要阅读英文的技术资料(不是所有资料都被翻译成了中文) 。想要锻炼这个能力,就不要害怕阅读英文文档,多花一点时间去学,不行的时候在用词典翻译吧。
    同时使用很多软件最好都使用英文,甚至你的电脑用户名,因为有时他们只对英文友好。
  3. 编程并不是说数学很好才能成为大神。 编程语言确实涉及到很多算法,有一些还需要高等数学知识,但是,这些算法都已经被封装好了,你直接拿来用就可以了。而且有些工作更看重的是编程思维,除非是算法工程师才需要很好的数学功底。

3 C语言环境安装

写C语言程序用的软件很多,初学者一般都用IDE( Integrated Development Environment ),就是集成开发环境。一个软件就能包含 编辑器、编译器、运行环境 和 调试工具 多种工具。

3.1 IDE

推荐使用 Dev C++ ,可以通过下面的网址到官网下载最新版的:
http://sourceforge.net/projects/orwelldevcpp/?source=directory

Dev C++ 软件小巧不占空间,打开迅速,免费使用,有中文字体,所以将它推荐给初学者。

当然你想使用其他IDE也是没有问题的,比如 Visual Studio,Code::blocks, Visual C++ 6.0,Visual C++ ExpressEclipse ,Turbo C 等等。

这里也有两个在线运行环境:(第二个功能会更多一点)
https://www.runoob.com/try/runcode.php?filename=helloworld&type=c
http://clin.icourse163.org/

3.2 编辑器(editor)

可能有小伙伴不是很理解什么是编辑器,解释一下。
可以说就是“文本”编辑器,跟 记事本 性质是差不多的。
在这里你可以尝试打开一个记事本,然后把下面的程序打进去,然后把文件名修改为 main.c(后面也要记得修改)
这样你就完成了利用编辑器对程序进行书写。

#include <stdio.h>
 
int main()
{
    /* 我的第一个 C 程序 */
    printf("Hello, World! \n");
 
    return 0;
}

3.3 编译器(complier)

刚才写好的 main.c 叫做 源文件,上面的程序叫做 源代码,但是这都是给人看的,电脑是看不懂的,机器能看懂的只有机器码(就是所谓的“0”“1”)。

把源代码转换成计算机能够识别的二进制形式 ,这个过程就是编译,而用到的工具就叫做编译器。

最常用的免费可用的编译器是 GNU 的 C/C++ 编译器—— gcc 编译器,它适合于 C 和 C++ 编程语言 , 生成的目标文件的后缀是 .o

一个源文件会编译出一个目标文件。

3.4 链接(Link)

编译后再通过链接 ,其实就是一个“打包”的过程,就能将所有二进制形式的目标文件(因为实际开发会有很多的源文件)和系统组件组合成一个可执行文件。

不过这一步基本上编译器都会帮我们完成了。

3.5 可执行文件

我们就直接借用 dev 的编译器来展示一下吧。
右键 main.c ,点击打开方式,选择 dev ;或者打开dev软件,然后在菜单栏 or 使用快捷键 Ctrl+O 打开文件。

然后点击工具栏的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQuO0Ruc-1573317936414)(C:\Users\CoolCucumber\AppData\Roaming\Typora\typora-user-images\image-20191109043336018.png)]这个按钮,或者按 F9 编译。

编译日志就会告诉你编译结果——是否成功。

在windows系统中,软件会生成的可执行文件为 xxx.exe ,而不是机器码,不过这是windows系统规定的,windows系统将你跟电脑隔离开来了,给了你一个较简单的操作环境。你打开这个文件,系统会帮你相当于运行了机器码,让电脑跑起来,但是你把这个exe文件放到其他操作系统上就运行不了了。

3.6 调试工具

以后用到了再讲。

3.7 dev的一些使用配置

3.7.1 快捷键

在这里插入图片描述
在菜单栏的编辑选项当中就可以看到常用的“注释”,“取消注释”,“缩进”,“取消缩进”,“复制行”,“删除行”等快捷键。

在菜单栏的工具选项当中也有一个快捷键选项,里面就有全部的快捷键配置了,不懂可以到这里查,不同的软件快捷键是会有些许不同,要学会查找,然后你也可以自己修改:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTCZoIZ8-1573317936415)(C:\Users\CoolCucumber\AppData\Roaming\Typora\typora-user-images\image-20191109112704175.png)]

3.7.2 编辑器外观

在菜单栏的工具选项当中有“编辑器选项”和“环境选项”可以把编辑器修改成自己喜欢的外观。

3.7.3 新建文件

新建文件的快捷键为 Ctrl+N

4 第一个C语言程序

其实第一个C语言程序我们已经写了。

#include <stdio.h>
 
int main()
{
    /* 我的第一个 C 程序 */
    printf("Hello, World! \n");
 
    return 0;
}

现在我们来慢慢解析这个程序。

4.1 程序框架

#include <stdio.h>  //把头文件导入进来
int main()          //程序的入口
{
    return 0;       //程序的结果
}

这个就是程序基本框架,每个程序都是要在这样的基础上进行编写的。

所谓头文件,是一种文件的名字(header),以 .h 结尾。头文件就相当于一个“武器库”,里面有很多“武器”可供你使用,来控制电脑,printf 就是其中之一,你能弹出“小黑窗”可以这个“武器库”的功劳。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENGeuW1t-1573317936416)(C:\Users\CoolCucumber\AppData\Roaming\Typora\typora-user-images\image-20191109112003283.png)]

这是源文件和头文件的名称和后缀

怎么记住<stdio.h>?std 就是 standard ,io 就是 input 和 output 。

4.2 实现功能

printf("Hello, World! \n");

所以咋们的“实际程序”其实只有这个句。
意思是什么,想必懂 print 英文的人肯定能理解的——就是输出嘛。而 fformat (格式)的意思。
你想要屏幕上打印什么,只要在写在(“ ”)就可以了,不妨试试改一下。

printf("刚剪的头发,帅吗?");
#include <stdio.h>
int main()
{
    int price = 0;

    printf("请输入金额(元):");
    scanf("%d", &price);

    int change = 100 - price;

    printf("找您%d元。\n", change);

    return 0;
}

4.3 注释

注释有两种办法:

//单行注释
//软件编译时会自动忽略
/*
多行注释
注释都是给人看的
*/

dev的注释快捷键:Ctrl + /

dev的取消注释快捷键:Ctrl +

4.4 小黑窗

这其实是控制台窗口,只能输入一些字符或者命令,所以我们的程序也被称为控制台程序(Console Application) 。 这算是DOS 时代的产物了,它没有复杂的功能,没有漂亮的界面,只能看到一些文字,虽然枯燥无趣,也不实用,但是它非常简单,不受界面的干扰,所以适合入门

4.5 注意事项

  • 一旦在语法上使用了非英文输入法就会出现错误,比如把最后的分号,改成中文的,看起来差不多,但是一编译软件就会报错了。
  • C语言每一条语句都是以分号结尾的。

5 数据类型(Data Type)和 变量(Variable)

int price = 10;

还是用上面的例子来解释,可以将上面拆分为两句:

int price;		//定义:数据类型 + 变量名
price = 10;		//赋值

5.1 定义

price 相信大家都知道是什么意思了,前面的 int 呢?

int :integer 的缩写,是整数的意思。

为什么这么写呢?这就是C语言的语法,就像中文英文主谓宾都有自己规定的次序。组合起来就变成C语言的定义语句,就相当于“创造”了一个地方给你存放想要放的东西(具体的price值),存放进来的东西要遵守我的“规定”(类型为int)。

这时你就可以把 price 称为一个变量。

定义一个变量的语法就是:Data Type + Variable name,如 int price;
(记得加上英文输入法的分号)

你也可以在一条语句中定义多个变量:

int a,b;
int a = 1,b = 2;

5.2 赋值

好了,现在要放东西进去的话,也可以写 price = 10;

= 是一种运算符,类似加减乘除的运算符,它在数学中叫“等于号”,例如 1+2=3,但在编程语言,这个过程叫做赋值(Assign)。

0(赋值号后面的东西) 放到 price(变量里面) 这个地方里面去。而这一句就相当于价格等于十块钱的意思了。

试试在程序中再加入一句:price = price + 100;

#include <stdio.h>
int main()
{
    int price = 10;
	price = price + 100;
    printf("price = %d\n", price);

    return 0;
}

好了,运行之后会有什么效果呢?

price 的值变成 110 了。

price = price + 100;

price 一开始等于10,然后执行了上面的语句,把后面的东西(price+100)放进 price ,所以price就变成 110 了,现在大家可以理解赋值号跟数学中的等于号是不一样的了吧。

5.3 数据类型(Data Type)

咋们再改一下代码:把数据类型改成short,一种更小的整数类型。同样是整数为什么会更小,上面也讲到了 存放进来的东西要遵守我的“规定”(类型为int) ,这是什么意思呢?一起从下面的例子来理解一下。

#include <stdio.h>
int main()
{
    short price = 10;	//short : short integer
	price = 123456;
    printf("price = %d\n", price);

    return 0;
}

你觉得上面的程序会输出什么呢?——price = 123456???
答案是:

甚至编译器都报了一个warning(警告):

这就是所谓的 “规定” —— short 规定了存放进来的东西是一个整数,而且是一个较小的整数,意思就是它能表示的范围比较小。超出了它的最大表示范围就会“出错”,准确来说是——溢出(overflow)

//如果把 short price = 10; 改成下面这句就可以了,你可以试试看
int price = 10;

那为什么会有表示的范围呢?又为什么表示的范围会比较小?

5.3.1 变量在内存中的存储形式

内存?任何一个程序在运行的时候都会占用内存的,所以一旦你开了太多程序,内存被用光了,你的电脑就会很卡顿。

所以咋们上面写的简单程序也是会占用内存的。程序结束运行,内存就会重新被释放。

  • 计算机要处理的数据(诸如数字、文字、符号、图形、音频、视频等)是以二进制的形式存放在内存中的,二进制的机器码计算机才能理解。

  • 我们将8个比特(Bit:0 or 1)称为一个字节(Byte),并将字节作为最小的可操作单元。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zj2O8lWj-1573317936417)(C:\Users\CoolCucumber\AppData\Roaming\Typora\typora-user-images\image-20191109133734044.png)]

  • 上面说的 “创造”了一个地方给你存放想要放的东西 就是在内存给你“安排”了一个空间给你存放二进制数据。但是一开始这个空间里有什么是不知道的,没有初始化的话会输出一些奇怪的东西,不过好在有些编译器偷偷帮你初始化了(就是赋值为 0 或者 1 )。你可以尝试一下:

    #include <stdio.h>
    int main()
    {
    	int p;
        printf("p = %d\n", p);
        return 0;
    }
    
  • 数据类型所谓的“规定”就是:指明数据的解释方式,还指明了数据的长度。

    (等下咋们再解释这个,先介绍一下进制)

5.3.2 进制

十进制的表示数字有几个?
10个——0,1,2,3,4,5,6,7,8,9
9+1,一位不够表示就需要再进一位(相当于09+01),并且最低那位又从 0 开始加起了——变成 10。

好,换成二进制。

二进制的表示数字有几个?
2个—— 0,1
img

而八进制(0,1,2,3,4,5,6,7)、十六进制(0-9,A,B,C,D,E,F)亦是如此。

十进制:decimal;二进制:binary;十六进制:hexadecimal(printf语句中的 %d 就是输出十进制数的意思,多学点英文没坏处

decimalbinaryhexadecimaldecimalbinaryhexadecimal
000810008
111910019
210210101010
3113111011A
41004121100B
51015131101C
61106141110D
71117151111F

5.3.3 数据的长度

short 规定的长度为至少占用两个字节,即2*8=16个比特位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mmz2AABe-1573317936420)(C:\Users\CoolCucumber\AppData\Roaming\Typora\typora-user-images\image-20191109141700152.png)]
可以表示 216 = 65536个数,上面出错的程序就是因为超过规定的表示范围了。
那它能最小能表示0 ,最大能表示63335 了吧,一共是65536个数,真的是这样吗?
那咋们再来试试把代码修改正确:

#include <stdio.h>
int main()
{
    short price;
	price = 65535;
    printf("price = %d\n", price);
    return 0;
}

运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWJJckGF-1573317936420)(C:\Users\CoolCucumber\AppData\Roaming\Typora\typora-user-images\image-20191109142410478.png)]
显然我们的猜想是错误的,为什么呢?接着往下看。

5.3.4 解释方式

short 实际上只能表示: -32,768 到 32,767
这就是解释方式决定的。
定义为 short 说明它是一个有符号数,所以表示范围一半给了正数,一半给了负数。
另外一种数据类型:unsigned short,才是无符号数,表示的都是非负数。
但是他们大小都是一样的,能表示的个数都是一样的,只是表示范围不一样而已。

#include <stdio.h>
int main()
{
    unsigned short price;	//这样子就没错了
	price = 65535;
    printf("price = %d\n", price);
    return 0;
}
整数类型
类型存储大小值范围
char1 字节-128 到 127 或 0 到 255
unsigned char1 字节0 到 255
signed char1 字节-128 到 127
int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295
short2 字节-32,768 到 32,767
unsigned short2 字节0 到 65,535
long4 字节-2,147,483,648 到 2,147,483,647
unsigned long4 字节0 到 4,294,967,295
浮点数类型
类型存储大小值范围精度
float4 字节1.2E-38 到 3.4E+386 位小数
double8 字节2.3E-308 到 1.7E+30815 位小数
long double16 字节3.4E-4932 到 1.1E+493219 位小数

浮点数就是可以表示小数的一种数据类型。浮点数的解释方式也跟整数不一样。

5.3.5 补充知识

  • 关于整数类型就是小数点后的数据一概去掉不管了。试试下面的代码:
#include <stdio.h>
int main()
{
    int a = 10/3;
    printf("a = %d\n", a);	//结果是3,小数点后的数字都不管了
    return 0;
}
  • 要是想获取某个数据类型的长度可以使用 sizeof 操作符

    #include <stdio.h>
    int main()
    {
        short a = 10;
        int b = 100;
        int short_length = sizeof(a);	
        int int_length = sizeof(b);
        int long_length = sizeof(long);
        int char_length = sizeof(char);
        printf("short=%d, int=%d, long=%d, char=%d\n", short_length, int_length, long_length, char_length);
        
        return 0;
    }
    

5.3.6 各种数据类型

img

6 推荐一款好用的文本编译器

7 本文文档下载链接

两个都是用Typora写的:
C语言教程-whitey主题.pdf
C语言教程-Github主题.pdf


觉得好的麻烦点个赞支持我一下谢谢~

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值