当前课程知识点:C/C++:从基础语法到优化策略 >  Final Exam >  Final exam >  1.1 Basic knowledges

返回《C/C++:从基础语法到优化策略》慕课在线视频课程列表

1.1 Basic knowledges在线视频

1.1 Basic knowledges

Short introduction to C, C++, compiling, build process, compilers and a simple example.

返回《C/C++:从基础语法到优化策略》慕课在线视频列表

1.1 Basic knowledges课程教案、知识点、字幕

大家好 这部分我们介绍一些基本的编程知识

首先 我们介绍一下什么是高级编程语言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文件读进去进行编译

再生成可执行程序

文件名传给可执行程序实际上是通过命令行参数传的

这个就是我们在讲的

了解一点之后我相信大家再看到类似的参数就不会觉得奇怪了

C/C++:从基础语法到优化策略课程列表:

Week 1 Quick start

-1.1 Basic knowledges

-1.2 Setting Out to C++

-Lecture notes

-Example code

-Quiz 1

Week 2 Data types

-2.1 Compile and link

-2.2 Integers

-2.3 Floating-point numbers

-2.4 C++ Arithmetic Operators

-Lecture notes

-Example code

-Quiz 2

Week 3 Expressions and statements

-3.1 Some operators

-3.2 for loop

-3.3 Relational expressions (> < ==)

-3.4 while loop

-3.5 Branching statements (if else)

-3.6 Logical expressions

-3.7 switch statement

-3.8 break and continue statements

-3.9 File input and output

-Lecture notes

-Example code

-Quiz 3

Week 4 Array, string and structures

-4.1 Array

-4.2 Array strings

-4.3 string class strings

-4.4 Structures, Unions and Enumerations

-Lecture notes

-Example code

-Quiz 4

Week 5 Pointers and memory management

-5.1 Pointers

-5.2 Allocate memory: C style

-5.3 Allocate memory: C++ style

-5.4 Managing memory for data

-Lecture notes

-Example code

-Quiz 5

Week 6 Functions

-6.1 Function review

-6.2 Various functions

-6.3 Recursion and pointer to functions

-6.4 Reference and const

-Lecture notes

-Example code

-Quiz 6

Week 7 Functions and optimization

-7.1 Adventures in functions

-7.2 Speedup your program

-Lecture notes

-Example code

-Quiz 7

Week 8 ARM and OpenCV

-8.1 C/C++ with ARM development board

-8.2 Some tricks in OpenCV

-Lecture notes

-Example code

-Quiz 8

Week 9 Class

-9.1 Classes in C++

-9.2 Constructors and destructors

-9.3 this pointer

-Lecture notes

-Example code

-Quiz 9

Week 10 Operator overloading and type casts

-10.1 Operators in cv::Mat in OpenCV

-10.2 Operator overloading

-10.3 Friend functions

-10.4 Automatic conversions and type casts for classes

-Lecture notes

-Example code

-Quiz 10

Week 11 Dynamic memory management and classes

-11.1 Dynamic memory and classes

-11.2 New and improved String class

-11.3 Using pointers to objects

-Lecture notes

-Example code

-Quiz 11

Week 12 Class inheritance and memory management

-12.1 Class inheritance

-12.2 Static and dynamic binding

-12.3 Access control: protected

-12.4 Inheritance and dynamic memory allocation

-Lecture notes

-Example code

-Quiz 12

Week 13 Constructor, assignment and class templates

-13.1 Constructor and assignment

-13.2 Classes with object members

-13.3 Private inheritance

-13.4 Class templates

-Lecture notes

-Example code

-Quiz 13

Week 14 CNN, exceptions in C++

-14.1 CNN for image classification

-14.2 Exceptions

-Lecture notes

-Example code

-Quiz 14

Week 15 Friends, nested classes, RTTI and type cast

-15.1 Friends

-15.2 Nested classes

-15.3 RTTI and type cast operators

-Lecture notes

-Example code

-Quiz 15

Final Exam

-Final exam

1.1 Basic knowledges笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。