之前讲到我在学rust,rust比较难,学起来磕磕绊绊,回想起当年学C++,也是一样的痛苦,现在rust已经有所了解了,但暂时还没有做什么项目,主要是课余时间也不多。今天突然翻到以前下载的C++ Primer Plus,再读时,有拨云见日之感。没错,现在我决定捡起曾经被我搁置的C++,毕竟现在基础知识有了一定的积累,看起书来可比以前轻松多了(第一次读C++ Primer Plus大概是在初一)
本文主要也是记录一些细碎的要点,以备查阅。
变量
变量使用之前需要声明
不像一些动态语言,cpp中变量使用之前需要声明,格式如下
1 | 数据类型 变量名 (=初始值); |
这样的初始值甚至可以是函数的返回值,例如可以有以下语句:
1 | double side = sqrt(area); |
这个过程叫做初始化。
(强制)类型转化
在C++中,数值有三种强制类型转化的方法:
- 同C,以
(type) value
的形式进行转化,如以下代码:
1 | int x; |
则x实际为9(C++直接截断而非四舍五入)
C++风格:
type (value)
static_cast<>
运算符,格式:static_cast<type> (value)
复合类型
结构体
在学习C++的struct时,C++ Primer Plus没有给出如何针对结构体中不同字段单独赋值,只给了一种按顺序赋值的方法,像这样:
1 | Rectangle rec = {4,3}; |
我想应该没人会觉得这样的代码可读性很好,而且万一以后这个结构体的定义变了,哪怕只是各字段换了个顺序,都要修改其余代码,实在是太蠢。我就想C++肯定有像其他语言那样指明给哪个字段赋值的语法(毕竟我记得C都有)
上网查了一下,确实是可以指定字段的,
实现上有两种方式,一种是通过点号加赋值符号实现,即“.fieldname=value”,另外一种是通过冒号实现,即“fieldname:value”,其中fieldname为指定的结构体成员名称。前一种是C99标准引入的结构体初始化方式,但在C++中,很多编译器并不支持。
1 | //点号+赋值符号 |
我想我更喜欢第二种,rust就是这么用的。
一些感想
关于C++ Primer Plus,就我看到的前面这几章,我感觉讲得太慢了,当然,这本书考虑到了一部分没有编程基础的读者,可是如果读者真是没有一点基础的话,像我几年前甚至都没学python就去看这本书时,着实云里雾里的,因此从这一角度来说,这本书的设计可能有少许瑕疵。
另外这段时间,翻了一下的王爽的《汇编语言》这本书,里面有段话让我有所感触:
思 考 下 面 几 个 问 题 :
(1) 人 们 用 C 语 言 编 程 时 都 要 用 变 量 , 我 们 就 非 用 不 可 吗 ?
(2) C 语 言 规 定 用 户 写 的 程 序 从 main 函 数 开 始 , 我 们 就 非 要 用 main 函 数 吗 ?
(3) printf 函 数 可 以 接 收 不 定 数 量 的 参 数 司 空 见 惯 , 我 们 就 不 怀 疑 了 吗 ?我 们 把 问 题 再 精 简 一 下 , 使 其 变 得 更 本 质 :
(1) 都 在 用 , 我 们 就 非 得 用 吗 ?
(2) 规 定 了 , 我 们 就 只 知 道 遵 守 吗 ?
(3) 司 空 见 惯 , 我 们 就 不 怀 疑 了 吗 ?在 许 多 领 域 内 , 我 们 被 这 些 所 谓 都 在 用 的 , 规 定 了 的 , 司 空 见 惯 的 , 蒙 蔽 了 多 久 呢 ?
如 果 我 们 被 这 些 蒙 蔽 , 那 么 , 真 正 蒙 蔽 我 们 的 是 这 些 , 还 是 我 们 自 己 ?
很多时候,我们学习的过程中,无论是一门编程语言,还是一门学科,我们往往都是从模仿开始,这是学习的基础,我们让自己变得更像模仿的对象,却很少给自己真正探索的机会。
我们可能会觉得真的没有什么好怀疑的,此时,可能正说明我们的能力有所局限。
比如rust中println!()
这个宏,从写hello,world时我就在用,但是到现在,仍然对宏
背后的复杂系统一知半解。
计算机这个领域,发展到今天,历史也不算短了,可还是很年轻,为什么呢?
因为一代代的coder,他们怀着一颗探索与尝试的心。人们称他们为geeker(极客)
,有佩服,但也有不理解。你说一个人整天啥也不干,就对着一个黑框框打字,时而欣喜,时而皱眉,是不是很像疯了?
但,也许TA正在开发一个将来获得数万star的开源软件,也许TA在研究怎样让现有的方案快3%,也许,TA正在自己的Home Server上部署着TA的第N个玩了两天就一直吃灰的docker,
然而,TA做的,不管有无回报,有无“用处”,都是走在技术的前沿(bleeding-edge)的。
他们正在做的,可能正是人们司空见惯以外的事。
但正是这样,CS这个永远年轻的领域才一直给人以惊喜啊!