加载中...
做一个“会”犯错误的程序员
第1节:初学C++,应该学什么?
第2节:《白话C++》练的什么“功”?
第3节:《白话C++》练的什么“武”?
第4节:打开浏览器,线上玩转C++
第5节:逐字逐句,深入理解C++最小例程
第6节:做一个“会”犯错误的程序员
第7节:Hello World 中文版
第8节:Hello World 函数版
第9节:Hello World 交互版
第10节:Hello World 分支版
第11节:Hello World 循环版
第12节:Hello Object 生死版.上
第13节:Hello Object 生死版. 下
第14节:Hello Object 成员版
第15节:Hello Object 派生版
第16节:Hello Object 多态版
课文封面

学习C++常见编译错误的等级与分类,提前“见识”初学者容易犯的具体错误,并归纳看似不同具体错误之后的共同点,做到心中数,精准预判自己未来会犯的错误……

1. 警告和出错

1.1 Warnning

警告:编译器认为代码写得不合理,但符合语法,可以通过编译,但程序运行可能产生意外的结果。

一个 char 类型的数据,在多数平台上,只能存储 -128 ~ 127 范围的数值,但代码将 128 赋值给一个 char 数据,即可获得一个警告:数据溢出;而不是一个错误。

1.2 Error

出错:即代码存在语法错误,无法通过编译。

将一个整数,赋值给一个字符串类型的数据。

2. 声明和定义

现实生活中我们做不少事情,会有一个规划或设计的阶段,此时并不需要将做此事所需要的所有事物,都摆在眼前,才能做这个规划或设计。

比如,你想为新房配置一个彩电。那么,你可以做如如下两个 “声明”。

  • 声明一:主卧这面墙,将挂一块 100 吋的超薄彩电,品牌为 瑞幸;
  • 声明二:客厅这面墙,将挂一块 200 吋的超薄采电,品牌为 华为;

这就叫声明。声明虽然不是实物,但描述得越具体越好。比如上例,可认为是描述了几个特征:

  1. 电器类型(彩电)
  2. 外观特点(超薄)
  3. 关键指标(100吋和200吋)
  4. 品牌(瑞幸、华为)

实际还可以加上颜色、价格等特征描述……试想,如果设计师问你家里要不要电视?你回答“随便”;问你彩电你喜欢什么品牌?你回答“随便”;问你想要多大的,你回答“随便”……除非遇上“大师”,否则,普通的设计师都不敢接你的活。

C++是一门严谨的语言,讲究凡事要有出处(参看隔壁课堂:从机器指令到高级语言 )。代码里要用到某个数据,如果既不给出实物(定义,defined),又不给出相对详细的说明(声明,declared),通常就会报错误。

假设设计师(相当于编译器接受你以上关于电视的声明,开始做相关设计;甚至,为了做出更好的设计效果真,他甚至可以请师傅切割硬纸板,做两个尺寸分别是100和200的假电视,挂在墙上,东看看、西看看……

一切都挺好,然后,真的要开始装修时,负责办理物料实施工发出施工错误报告:

  • 错误一:市场上有 100 吋的超薄彩电,但没有瑞幸品牌的彩电;
  • 错误二:市场上有华为超薄彩电,但他们家暂时不生产200吋的。

负责实施的工队,就叫链接器。此处的“链接”,就相当于将设计中要用到的各种东西,都一一落实并组装起来。每一个用到,且能落实的事物,就叫 “有定义的(defined)”对象;而找不到的东西,叫 “未定义的(undefined)”对象。

所以,请理解上面的错误,实质是在表达:

  • 瑞幸牌的100吋超薄彩电——抱歉,未定义!
  • 华为家的200吋超薄彩电——抱歉,未定义!

上面报的两个错误,可以叫“链接”错误。

不过,广义上的“编译”,也包含了“链接”过程,因此本文将上述的错误,也称为编译错误。

3. 课堂视频

4. 概要导图

导图