当前课程知识点:C/C++:从基础语法到优化策略 > Final Exam > Final exam > 1.1 Basic knowledges
返回《C/C++:从基础语法到优化策略》慕课在线视频课程列表
Short introduction to C, C++, compiling, build process, compilers and a simple example.
大家好 这部分我们介绍一些基本的编程知识
首先 我们介绍一下什么是高级编程语言High Level Language
我们程序员其实就像语言翻译
把英语翻译成中文
他实际上只是个translator 是个翻译员
他把我们的意图翻译成高级编程语言
然后再把高级编程语言
当然也可能是汇编语言
把些语言再交给编译器由编译器转成机器码
最后交于计算机来执行
所以说
高级编程语言实际上是
来连接
广义的说
编程语言是连接我们跟计算机的工具
我们都知道
计算机的执行的指令都是二进制的
是0101之间的二进制的指令
如果让我们人去写
像1010的去写
是非常的困难非常的辛苦
也就是早期的时候我们用纸带打孔
类似于这样的工作
所以说后来就有了汇编语言
汇编语言把一些指令把这些二进制指令
做成人可以理解的
比如说在我们右下角的例子里面
汇编语言ADD a b 把两个相加
要比写01要容易得多
但是实际上汇编语言他每个指令也是非常简单的
但后来就出现了High Level Language
也就是说是高级的编程语言
高级的编程语言就对我们人类更加友好
他的语法跟英语有点接近
根据语法我们就可以写一些
更复杂的程序更容易的写复杂的程序
我们写好之后
可以交由编译器把它编译成机器可执行的指令
我们这门课讲的C语言
其实有比较长的历史了
我们可以认为是上世纪70年代他诞生到现在
有50年的历史
差不多50年的历史
c++其实它的标准也不是一成不变的
我们最新的标准有C++11 C++18
是比较新的标准
他一直在演进
但是演进的相对来说还是比较慢
C++(C语言)的规则相对少一点
如果是C++的话
它的出现要比C要晚一些
要晚很多
实际上C++我们可以看成是对C的扩展
有的人会说C++实际上是C语言的C加上类
这样说的话在最早最早期的时候也许有点对
但是现在来看这样说已经是完全不对的了
因为C++的标准演化的非常快
你可以看其实我们每几年都会有个新标准出来然后往上排
最新即将后面发布的标准是C++20标准
所以说C++的标准又非常多非常复杂
要掌握所有的C++标准里面的知识点
几乎是不可能的任务
知识点特别多
但是C++跟C语言相比他最大的不同点
是他的编程思路是不同的
在C++里面
它是面向对象的编程思路
C语言是面向过程的
面向过程和面向对象的编程有什么不同呢
在C语言里面
你就可以看到我们会定义非常多的函数
函数完成特定的功能
函数之间又相互去调用
所以说你可以看作是一个执行的流程
在从上往下从前到后
这样去做一遍把事情做完
如果是面向对象的编程的话
稍微一点不同
他把很多的东西封装成类
然后创建出对象来
对象它有属性它有特定的功能也就是函数或者方法
然后对象之间通过发消息来相互沟通相互调用
所以说他在思路上是跟C是完全不同的思路
那么我们的编程是怎么编呢
几乎所有的编程语言其实都是有三大步
第一步就是编辑——Edit 就是写代码
我们先找一个文本编译器把代码写出来保存到磁盘上
这是把语言编码过程实现了
那么我们最终实际上是希望我们写的代码能够运行
而计算机运行的是二进制的指令
那怎么办
我们就需要编译器来处理剩下的事情
所以有编译器来把代码转成机器码
那么转换的过程就叫编译——Compile
编译其实是有三步的在C和C++里面
第一步是预处理
第二步才是真正严格意义上的编译
第三步是链接把不同模块链起来链成可执行程序
我们就在电脑上生成了可执行的程序的文件
如果是Windows操作系统
你会发现 EXE 文件也就产生了
那么我们怎么去运行程序呢
我们运行的时候
首先我们需要把程序去装载
装载怎么做
那么在Windows下面我们可以双击它
操作系统会自动去装载
然后是执行
装载之后操作系统就会去执行它
那么说我们整个编程程序是怎么诞生的
先写代码
大家把它用编译器转成机器码
最后如果你需要的时候你去执行它
这么一个过程
那我们再来看一下
文件的扩展名
我们要编程的时候
我们还是尽量严格一点就遵循一些规范
跟Java语言比跟Python语言比
其实C和C++的规范非常灵活他约束非常少
所以比如说我们就讲这里的扩展名
原文件的扩展名
那么C和C++这个扩展名其实也是很复杂
但有的老的系统里面他用C语言大写的C来表示
CSS来表示C++语言
还有C++这种扩展名
那么现在来讲的话
我们最通用的最常用的扩展名
如果你是C语言的就用小写的c字母作为扩展名
如果你是C++语言你就用cpp
这是目前现在大家的规范
按这个遵守就可以
前面我们提到过
我们编辑好了cpp文件
也可能还有一些头文件
我们编译是个什么过程
编译实际上说是把cpp文件从
用编译器把它从cpp转成object file
这个.o文件的过程
这是编译器做的事情
这叫编译
编译之后 这件事情没有完
没有完因为我们可能有多个
原文件比如说cpp
每个cpp经过编译之后都生成一个object文件
那么我们有多个
那就生成多个object文件
生成他之后这些都是二进制的
那还有一步Link
链接他把几个object的文件链在一起
生成真正的可执行程序
这才是完成了我们的程序的创建
我们就可以去执行这个可执行程序
所以大家一定要清楚
C++里面的生成程序是分两步的
第一步是编译
第二步是链接
为什么要区分它 是因为
这两步它产生的错误是不一样的
那么Debug的时候
第一个重要的能力就是你要一眼区分
这是个编译错误还是个Link Error 链接错误
然后你去对症下药解决问题
我们编译器有很多
在这里我推荐用GCC来编译
大写的GCC他的意思是GNU Compiler Collection
他指的是一系列编译器的集合
对于C++语言来讲 我们用g++
对C语言来讲 我们用小写的gcc来编译
在课程里面我主要会在命令行下面
给大家演示如何用g++或者gcc来生成可执行程序
把cpp转成可执行程序
为什么要样做
其实我希望在我演示的时候
让大家能够越来越看得多了之后就知道编译的过程
那么后面大家真正去写代码的时候你可以去选择
你喜欢的集成开发环境
比如说Windows平台下面的Visual Studio
如果是跨平台的
我们有Vscode 是跨平台开源软件
还有很多其他的大家都可以自由去选
g++ / gcc 他们的用法基本上是一样的c
他们有很多一系列的选项
些选项有-c / -o / -g 在后面的例子里面
我会逐渐的给大家演示这些选项的用法
在这里我们给大家例子就叫Hello World例子
所有的编程语言在开始的时候
都会给大家看Hello world
这三个例子是不同的
他们分别是C语言的例子 C++语言的例子和Java的例子
我们可以看在C语言的例子里面
#include 头文件是个
定义main()函数
用printf()来打印到我们的控制台字符串
换行用 表示换行符
如果是C++编程的话 我们一般用
当然他是兼容C的 是没问题的
更加纯粹的C++ 那我们#include "iostream"
我们的输出采用的是cout stream去把字符串输出到控制台
换行符用std::endl 是endline的缩写
第三个例子是Java的例子
这个例子跟C / C++最大的不同在于
Java的话它main函数 在Java里面叫方法
它需要放到类的里面
类的外面是不可以放代码的
这是Java的要求 Java规范
Java对面向对象的约束要求 更苛刻更严格
整个启动函数main 也是放到了类的里面 作为public的方法打印出来
介绍完三个例子之后
我给大家演示一下这三个例子
这三个例子里面
我们可以看到在里面目录下面我有一些代码
我们的第一个代码比如说是helloc.c 的例子
我们怎么去编译呢
我们可以直接用gcc helloc.c
输入回车 编译完毕
我们再来看一下目录下就多出来a.out这个文件
我们怎么去执行这个文件呢
我们要把它加载运行到操作系统里面
那我们就 ./当前目录下面的a.out去执行回车
那就Hello World打印出来了
为什么输出的叫a.out
是因为我没有指定输出文件名
所以说就输出a.out
那我们把a.out删掉
现在看就没有了
我们重新编译一下
然后我们可以指定用-o o是指output
用这个选项来指定输出的文件名
可执行的文件名
比如说我们可以叫他hello
你可以给他起任何名字都可以
回车
这个时候我们可以看编译出来hello执行程序
那我们就运行一下 是一样的
那么我们再把它删掉
把可执行程序删掉
我们再来看第二个例子
是hello.cpp这个例子
这个例子是C++语言的代码
如果我们用C语言的编译器去编译它
他可能就会出错
这边就链接产生了一些链接错误
我们用g++去编译看 ok他可以过
他也生成a.out
我们运行a.out 那就Hello Word 这是C和C++的
代码已经写好了我们用gcc或者g++把它转成了可执行程序
我们还有Java的例子
Java的例子有点不同
我们Java的例子呢
首先一点
文件名就不同
Java的要求就管的比较宽了
文件名要跟类名是一样的
就是说Java的规则非常苛刻
他不要让大家有自由度
这样的话避免犯错
所有的人写的代码都是非常相似的
那Java的代码要怎么去编译呢
我们就要用javac编译器去编译Hello.java
编译完之后就产生了
我们多个文件Hello.class
是从Java源文件生成的class文件
那么这个东西能不能执行呢
这是不可以执行的
你去执行它是不可以的
你样去执行是不可以的
你加上执行权限也不可以
因为它是中间文件
实际上它不是可执行文件
Java的程序要执行要Java Hello
这样来执行Hello World
那跟刚才的C和C++生成的a.out有什么不同呢
不同的在于a.out本身是可执行程序
这是C / C++产生的
而Java运行的时候
你运行的是Java 是个虚拟机
它会调用虚拟机把Hello.class装载进去 然后去执行
他真正运行的程序是Java虚拟机而不是Java程序
Java虚拟机把Java 的class文件输入进去
根据class文件的指令去做相应的操作
也就是说操作系统看起来是Java虚拟机在运行
如果我们把Hello.class删掉
我们可以看到如果我们再来运行java Hello
他就会说找不到这个class
所以说这是Java跟C++ / C的很大的不同它是有虚拟机
虚拟机它有它的优势也有它的缺点
它的缺点就是效率
你用虚拟机来运行虽然比脚本语言解释直接执行要快
但是比C我们的直接的可执行程序还是要慢的
最后给大家介绍一下命令行参数
在我们前面的例子里面
我们的main()函数是没有参数的
实际上在很多例子里面
网上你看到一些代码main()函数实际上是有参数的
两个参数第一个是整形的变量argc
第二个是字符串的指针
这是char类型的数组的指针
也就是说有两个指针的指针
或者写成这种方式两个 * 号也是可以表示指针的指针
它表示的是什么呢 他有什么作用呢
实际上这个表示的是在命令行运行程序的时候他所输入的内容
在这里也有个例子给大家展示
我们有代码叫command.cpp
这个代码大家看#include "iostream"
在这里面 这部分是跟代码没关系的
我们来看argc
argc怎么去用它
argc是个整数那我们就去遍历一下
从0到argc去循环
argc表示是命令行参数的个数
那么我们就可以去遍历它
每一个命令行参数
是存在argv数组里面是字符串
我们可以做循环就把它打印出来
我们说打印的内容就The command line arguments are 就下面列出来
先做tab缩进 打印出编号
再把内容打印冒号
再把内容打印出来然后换行
那我们来看看程序
把它编译之后生成a.out
比如说输进去了I love cpp
那么在这个时候
我们运行的程序是a.out
I love cpp是他的参数
回车我们可以看到
个参数实际上是我们运行的命令本身
第1 2 3实际上是以空格分割第一个单词第二个单词第三个单词
那么看是不是你就可以理解上一条命令
g++ command.cpp他在做什么
g++ command.cpp他在做什么
他通过命令行参数读到了文件名是command.cpp
那么在g++程序 他就可以把cpp文件读进去进行编译
再生成可执行程序
文件名传给可执行程序实际上是通过命令行参数传的
这个就是我们在讲的
了解一点之后我相信大家再看到类似的参数就不会觉得奇怪了
-Quiz 1
-Quiz 2
-3.3 Relational expressions (> < ==)
-3.5 Branching statements (if else)
-3.8 break and continue statements
-Quiz 3
-4.4 Structures, Unions and Enumerations
-Quiz 4
-5.3 Allocate memory: C++ style
-Quiz 5
-6.3 Recursion and pointer to functions
-Quiz 6
-Quiz 7
-8.1 C/C++ with ARM development board
-Quiz 8
-9.2 Constructors and destructors
-Quiz 9
-10.1 Operators in cv::Mat in OpenCV
-10.4 Automatic conversions and type casts for classes
-Quiz 10
-11.1 Dynamic memory and classes
-11.2 New and improved String class
-11.3 Using pointers to objects
-Quiz 11
-12.2 Static and dynamic binding
-12.3 Access control: protected
-12.4 Inheritance and dynamic memory allocation
-Quiz 12
-13.1 Constructor and assignment
-13.2 Classes with object members
-Quiz 13
-14.1 CNN for image classification
-Quiz 14
-15.3 RTTI and type cast operators
-Quiz 15
-Final exam