现在我们通过一个简单的C程序
来让大家有一个感性认识
注意我这里写的很清楚
是C的程序 不是C++的
我们编写一个程序
显示一个字符串hello World
我们程序代码展示给大家
总共就六行
俩花括号还占两行
所以实际上就四行
看上去很清楚
第一行#include
第二行就是int main()
我们先说第二行
因为这很重要
每一个C和C++的程序都有一个主函数
这个主函数的名字叫做main
名字是固定的 就这么写
main全小写
这就是我们的主函数
这就是这个主函数的函数头
每一个程序就这么一个
必须有一个 只能有一个
除非你写的不是程序
而是C或C++库
那个不需要main
这是我们的主函数
花括号对就表示这个主函数的函数体
里面封装我们的语句序列
对于我们这道题呢
情况很简单
第一条语句是#include
std是标准
io就是input output
叫输入输出
就这意思
.h h就是header 头文件
我们要包含这个头文件
这个是预编译指令
我们要在编译前把它封装进去
然后才能编译
我们要包含这个标准头文件
C标准库里面给我们提供
你直接用就行了
关键是为啥要用这条语句
因为这我们调用了printf
标准库函数
它在我们的输出设备上面输出一行文本
这个输出设备
一般对应我们计算机屏幕
投影仪当然也是输出设备
这行文本可以按照很特殊的格式
来去构造 拼凑 生成
双引号引起来的
“hello World!\n”
称为字符串
“\n”是什么呢
它不是两个字符——一个“\” 一个“n”
它是一个转义字符序列
用来表达输出一个换行
换行这个东西
你在写程序的时候觉得很直接
你按一下Enter就做完了
可是你要在程序运行的时候
输出一个换行可不能这么做
你不能在“Hello World！”后面回车
那个换行是不存在的
换行会变成我们源文件一部分
不是程序执行一部分
所以要想在程序运行的过程中
输出一个换行符
必须用一个转义字符序列
这里就是“\n”
“\”表示转义序列开始
“n”表示产生一个换行
printf是标准库函数
这个函数的函数原型是写在“stdio.h”
这个头文件里面的
你想知道这个函数用的对不对
你必须把这个“stdio.h”文件调出来看
两个对照 才能知道它对不对
我们是这样 编译器也是这样
编译器要知道
我们这个printf函数用的对不对
它必须把头文件调出来
然后两者一对照
才能知道我们用的对不对
其实不仅仅是这样
它还要知道
这个函数入口地址在哪里
没有函数原型
我们就找不到函数入口地址
最后代码是return 0
我的程序做完了 结束了
后面有一个0
表示这个程序做完以后
会带回来一个结果
这个结果必须是整数
我们就传了一个0回来
为什么它必须是一个整数呢
在程序是怎么体现的呢
就是main函数的前面
有一个int这样一个标记
这就表示main函数做完了
它会带来一个结果
这个结果就是这个函数的返回值
返回值是一个整数
那这个整数你说我返回1
return 1、return 2、return -1行不行
行 但是只要你有经验
你一定不会写1、-1这样的数
你一定会写0 为啥呢
因为这个返回值是给操作系统用的
这个结果会传给操作系统
操作系统要根据你传回来这个结果
来决定你这个程序有没有正确执行
有没有错误
如果发生错误 什么性质的错误
我们知道正确执行的路就一条
而错误执行的路是很多条
对吧 这叫什么
幸福的家庭总是相似的
不幸的家庭各有各的不幸
这个也是这样 它发生错误了
错误有很多种
正确执行了 就一种情况
错误执行了 很多种错误
A类错误、B类错误、C类错误、D类错误
那么操作系统怎么区分
它们之间的关系呢
那你写程序就要定义好
A类错误我返回1
B类错误我返回2
C类错误我返回3
然后操作系统就查我的错误返回值
返回1 返回2 返回3
一下不就明白了吗
哦 你这程序发生什么类型的错误
退出值是什么
然后我才能有的放矢去做后续的操作
所以main这个返回值除非发生错误
否则同学们一定要return 0
这是我们简单C程序
现在我们把它写成C++的版本
我们用C++的程序代码
现在几行呢
七行 多了一行
这一行叫using namesapce std
在C++里面
要按照C++格式做输入输出的操作
C++提供了一个全局对象
我们称它为标准输出流
叫cout 我们可以直接用
复杂的输出它其实还不如printf
但简单的输出它比printf方便
因为可以连续地输出
这个东西的定义在哪 在头文件
“iostream”里
所以我们包含这个头文件
头文件后面没有“.h”
这个文件名字就叫“iostream”
早期的C++是有“iostream.h”的
现在新版C++格式后面“.h”都不要了
就叫“iostream”
类似地C程序（的头文件）前面要加一个“c”
比如“stdio.h”
你要想用C++新格式包含它
就要写“cstdio”
后面“.h”就可以不要了
C++引入一个很特殊的东西
我们称它为名空间
英语叫它什么
namespace
这个空间名字叫什么呢
叫std 标准名空间
C++标准库的名字呢
都在标准名空间里
比如cout、endl
都在标准名空间里
和别的名空间是分开的
这是非常重要的一个设计
如果名字太多
全在一个空间里面
重名的话不太好解决啊
现在你可以给这些名字
定义不同的名空间
两个名空间里面名字就可以一样
因为可以通过名空间来解析它们
cout、endl都在这个名空间里
你要想用它你必须写using namespace std
才能够完成这个名解析
如果没有这行语句
就应该写std::cout
std::endl
每个名字前面都要加上名空间的名字
加上“::”
这叫名解析操作符
好麻烦啊
所以我们这里面就写using namespace std
简短的程序我们就这么写
我们用cout来完成标准输出
用“<<” 表达数据流动的方向
你看“<”箭头从哪到哪
开口在右边 箭头在左边
表示数据从右边向左边流动
就这个意思
按照这个格式 继续流
<< endl
把endl这个标记也流到了这个cout里面
end l是什么 叫end line
结束这一行 形成一个换行
就是这个意思
然后return 0结束
这就是很典型的C++程序代码
现在我们来看第二个例子
我们要编写一个程序
来计算用户输入的两个整数之和
这段代码就比刚才要复杂了
我们这道题就需要三个量
一个叫a 一个叫b 一个叫sum
定义就定义在这里
我要定义一个整数数据对象就用int
后面跟着那个变量的名字
如果有很多变量同时定义
中间用逗号来分隔开
我要得到a、b两个量的值
让用户在程序运行的时候输入
我会输出“a： ”
之后光标就在后面闪烁
提醒用户输入一个整数
用户输入这个整数我们怎么得到呢
cin 它和cout一样的
也是全局对象
也是定义在“iosdream”这个头（文件）里
我们称之为标准输入流
通过键盘哗啦哗啦不断往里敲
不管你敲什么东西
它都进入cin
然后我们要把数据一个一个取出来
取一个整数给a
那我们就写cin >> a
就把这个数据从cin这个标准输入流里面
传给这个整形变量a
a就会得到一个整数
如果没有cout
你就直接写cin >> a
然后cin >> b
或者你连写cin >> a >> b
程序本身是没问题的
可以运行
但是你程序什么提示信息都没有
用户压根不知道你要干嘛
这样的格式不妥当
所以每个输入数据理论上来讲
都应该给出一个提示
让用户知道你要求它输入什么
这两个量都输入完
我a加b 赋值给sum
注意这不是真正的等式
我们称它为赋值
那个等号称为赋值号
我们也不应该念成等号
为什么它不是等号呢
讲起来其实很简单的
（对于）数学上的等号
左边调到右边
右边调到左边
是不影响它等式正确性的
你把这个左边和右边对调过来试一试
那是不可能的
我要把a和b两者的值加起来
然后把它的结果传给sum
这个动作是需要耗费时间的
它不是纯粹数学上
和时间完全无关的一个等号
所以它其实不是等号
它叫赋值号
现在我们想得稍微再深入一点
我的main函数里面有三个量
这三个量名字叫a、b、sum
你肯定要保存起来
它方在哪呢
放在我们计算机内存里
所以我划一个方框
来表达存储这个数据的内存区域
在旁边给它贴一个标签
写了一个名字叫a
这个a 注意我不是写在这个框里面的
框里面我应该写什么呢
框里面我写的是这个量
它当时保存的值是多少
a后来得到了1
b后来得到了2
这两个数据就会写在这里
我一求和 sum结果就是3
这就是我们数据实际存储过程
现在对C/C++的程序结构做一个总结
C/C++程序正常情况下由一个
或多个函数组成
其中有一个唯一的主函数
我们称之为main
程序执行的时候
由主函数的第一条语句开始
到主函数的最后一条语句结束
其它的函数都是由主函数
直接和间接调用
整个程序的执行流程
和这些函数它的定义的顺序
是没有关系的
每个函数都包括
函数头和函数体两个部分
C/C++里面包含了大量的库函数
我们都可以直接用