抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

之前讲到我在学rust,rust比较难,学起来磕磕绊绊,回想起当年学C++,也是一样的痛苦,现在rust已经有所了解了,但暂时还没有做什么项目,主要是课余时间也不多。今天突然翻到以前下载的C++ Primer Plus,再读时,有拨云见日之感。没错,现在我决定捡起曾经被我搁置的C++,毕竟现在基础知识有了一定的积累,看起书来可比以前轻松多了(第一次读C++ Primer Plus大概是在初一)

本文主要也是记录一些细碎的要点,以备查阅。

变量

变量使用之前需要声明

不像一些动态语言,cpp中变量使用之前需要声明,格式如下

1
数据类型 变量名 (=初始值);

这样的初始值甚至可以是函数的返回值,例如可以有以下语句:

1
double side = sqrt(area);

这个过程叫做初始化。

(强制)类型转化

在C++中,数值有三种强制类型转化的方法:

  1. 同C,以(type) value的形式进行转化,如以下代码:
1
2
int x;
x = (int) 9.9;

则x实际为9(C++直接截断而非四舍五入)

  1. C++风格:type (value)

  2. static_cast<> 运算符,格式:static_cast<type> (value)

算术运算

除法运算

除法运算使用/运算符,不过它有点像python里的//,如果两个操作数都是整数,则结果为商的整数部分。例如,17/3 等于 5,小数部分被丢弃。

复合类型

结构体

在学习C++的struct时,C++ Primer Plus没有给出如何针对结构体中不同字段单独赋值,只给了一种按顺序赋值的方法,像这样:

1
Rectangle rec = {4,3};

我想应该没人会觉得这样的代码可读性很好,而且万一以后这个结构体的定义变了,哪怕只是各字段换了个顺序,都要修改其余代码,实在是太蠢。我就想C++肯定有像其他语言那样指明给哪个字段赋值的语法(毕竟我记得C都有)

上网查了一下,确实是可以指定字段的,

实现上有两种方式,一种是通过点号加赋值符号实现,即“.fieldname=value”,另外一种是通过冒号实现,即“fieldname:value”,其中fieldname为指定的结构体成员名称。前一种是C99标准引入的结构体初始化方式,但在C++中,很多编译器并不支持。

1
2
3
4
5
//点号+赋值符号
struct A a={.b = 1,.c = 2};

//冒号
struct A a={b:1,c:2};

我想我更喜欢第二种,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这个永远年轻的领域才一直给人以惊喜啊!

评论

留下神评妙论