C/C++ Programming

For Can

Last Update:2019年1月2日

0. 序言

市面上有很多C/C++专业书籍,但是这些书籍大同小异,对于非计算机专业出身的读者来说,阅读这些书籍不仅乏味、味同嚼蜡,而且难以触及编程的价值、本质与意义。
在使用C/C++进行工程实践的这近四年来,我对编程这件事有了较深的感触与体悟。我认为,一个真正优秀的程序员不仅应当掌握编程语言本身的特性,他(她)还应当对计算机的运行原理有着深刻的认知。
大部分编程书籍使用“自底向上”的结构构建书籍的骨架,但是这一次,我想用“自顶向下”的方法讲述编程这件事。是的,这不是为了让你对一门语言有多么熟悉,这是为了让你明白究竟什么是编程。

1. 数据与运算

计算机,在你面前的这台机器,从本质上来说,它究竟在干什么?
我的想法是,计算机即:

对输入的数据进行运算,并输出数据的数据处理装置

不论是你的智能手机、PC、Mac,还是家里的空调、冰箱、智能音箱,计算机无处不在地在表达着它的本质。

  • 空调:温度传感器输入温度数据,处理器中预先写好的程序定义了运算规则,对输入的温度数据进行运算得到输出后,控制压缩机的工作;
  • 智能手机:各类传感器——电子陀螺仪、红外传感器、听筒、触控面板等等——给手机的芯片输入数据,经由操作系统的调度和相关程序的运算处理输出数据,给予用户反馈(视觉、听觉等)。

以上的说法当然比较简单,但是在一定程度上已经说明了计算机所做的事情。
现在,请一定铭记于心这一流程,即取数据处理数据输出数据
再重复一遍,取数据处理数据输出数据
取数据处理数据输出数据

看起来相当简单。

取数据处理数据输出数据

所谓编程,就是处理数据的艺术

本节问题:

  1. 试再举三例,以论证计算机的本质(即如何取数据,处理数据,输出数据);
  2. 如果你有一些编程的经验,请根据下面的程序论证计算机的本质:
#include <iostream>

using namespace std;

int main(){
  double a = 0;
  cout << "Input a number: ";
  cin >> a;
  if(a > 0){
    cout << "You input a positive number." << endl;
  }
  else if(a == 0){
    cout << "You input a zero." << endl;
  }
  else{
    cout << "You input a negative number." << endl;
  }
  return 0;
}

2. 装数据的盒子

计算机很复杂,甚至可以说非常复杂,它至微又至精,速度至极却又精准无误。这一切得以可靠运行的基础就是数据

扫描二维码关注公众号,回复: 9108615 查看本文章

根据上节的内容可知,数据自始至终贯穿于整个计算机运行过程,所以本节,我们将好好聊一聊计算机中的数据。

首先我们需要明确一个观念,即在计算机中,万物皆为数据万物皆为01

无论是你的姓名身世,还是成绩绩点,当我们需要使用计算机来处理这些复杂的数据,使其被我们有效地利用起来的时候,它们都在计算机中被存储为数据,准确地说,是变成了”0“和”1“的有序组合。

切记,在你的存储器中,所谓的数据,只是一堆”0“和”1“而已。最重要的是计算机如何”看待“这些数据(很可惜,计算机如何”看待“数据这件事也要我们教它,后面会谈到)。

这就好比我们看书,书中的文字只是符号而已,但是我们人类具有读写的能力,我们能够见文知义。在一堆庞杂的符号中,在一堆动物看来无序的杂乱的笔画中,我们人类可以理解文字,并看到其深层的含义。

正如动物看不懂书,我们人类也看不懂(或者说很难看懂)那些”0“和”1“的含义,但是机器看得明明白白、清清楚楚。

编程这一过程就是人类写下指令,告诉机器该做什么。机器认识的是”0“和”1“,人类易于理解的是自然语言,编程就是编写近似于自然语言的程序经由编译器编译为01机器码再交由机器运行

实话说,计算机很愚蠢、很耿直,就像一个啥也不会的理工科男朋友,你得告诉他这是什么、那是什么,该怎么做,他听明白了才会做得很好。记住,这是非常让人讨厌的一件事,但是计算机就是这么耿直。

接着,就要讲一讲数据的存取。

把存储器想象成一个超级大的衣柜,一层又一层,顺序摆满了各式各样的衣服。

现在你让我帮你取一件衣服,没错,我就是那个耿直男友——计算机。你说取”那一件“,我可不明白是”哪一件“。正确的方法应该是,你得明确地告诉我那件衣服的位置

在计算机中,那件衣服的位置就变成了那个数据的位置,”那个数据“是个抽象的概念,正如“那件衣服”可以是裙子、T恤、棉袄等等,数据也充满了多样的形式,可以是类、变量、结构体等等。

那个数据的位置也就是我们时常听到的概念——地址

不过,一个非常有意思的点来了,当我试图告诉计算机,去取那个地址的数据时,这个地址本身也是数据。

万物皆为数据就是这个意思。

正如你跟让我取第3排,第6列的那件毛衣第3排,第6列这个位置本身也是数据。

计算机的愚蠢和耿直可不止于此,让我再和你说一件更加惊悚的事实——计算机连数字都不认识。

我们时常提到什么double、int、float类型的数据,为什么要定义这么多繁杂的数据类型啊,当然是因为计算机很蠢啦。刚才我们说计算机只认识0、1,是因为它真的只认识0和1这样的“一位一位的东西”。当你告诉他记录数字“-32”的时候,它可就瞬间懵逼了。数据类型的作用就是告诉计算机——你给我取用 n n 位,我要把数字-32放在这 n n 位里面。

且看下面的语句:

int a = -32;

这句句子含义非常丰富。首先,int类型在现代大多数计算机中占用32位(即4个字节),因此计算机看到这里后,向存储器申请了一块“地”,这块地有4个字节那么大(毕竟也是有大有小的);接着,这个变量叫做 a a ,因此以后这块地有了个名字,叫做 a a ,就像房产本上也有个名字,从此以后,提到 a a ,就代表这块地,这里需要注意, a a 只是一个符号;最后,这块地里头放的是什么呢,放了个“-32”。

这块名叫 a a 地里面放的是“-32”。

当之后计算机看到或者使用 a a 这块土地的时候,它会查询 a a 的属性,一查,发现这是一块int类型的土地,所以是大小为4个字节、含有符号的整数,计算机会用这样的方法来解释放在这32位里面的0和1,这才使计算机将其看作-32。可以说,唯有如此,才能将人与计算机对这32位数据解释得出的含义一致。

最后,我们来认识一个操作符:

&

这是C/C++中的取地址符。

刚才我们说,名叫 a a 地里面放的是“-32”,那这块地在计算机的哪里呢?用这个操作符就可以轻松得到:

&a

我们来看一个例子:

#include <iostream>

using namespace std;

int main(){
	int a = -32;
	cout << a << endl;
	cout << sizeof(a) << endl;
	cout << &a << endl;
	return 0;
}

得到的输出为:

-32
4
011BFD40

这一节的信息量还是比较大的,认真完成习题哦。

本节问题:

  1. 解释本节最后的程序;
  2. 我们在这一节一直谈到位、字节的概念,请自查并理解相关概念;
  3. 回顾二进制的运算、二进制正负数的表示等计算机基础知识,整理汇总相关资料并务必理解。

C++ Tips

int a;
int * const p = &a // 指针常量,*p可以修改*p = 8;(OK) p不可以修改 p++(ERROR)
int a,b;
const int *p = &a;// 常量指针 *p不可修改 *p = 8;(ERROR) p可以修改 p = &b (OK)
const int * const p = &a; // *p 和 p均不可改变
发布了10 篇原创文章 · 获赞 8 · 访问量 4607

猜你喜欢

转载自blog.csdn.net/ICE_KoKi/article/details/85649248