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. 装数据的盒子

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

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

首先我们需要明确一个观念,即在计算机中,万物皆为数据万物皆为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 n位,我要把数字-32放在这 n n n位里面。

且看下面的语句:

int a = -32;

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

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

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

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

&

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

刚才我们说,名叫 a 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均不可改变
Learning C++ Functional Programming by Wisnu Anggoro English | 10 Aug. 2017 | ISBN: 1787281973 | ASIN: B06WVD7CVT | 304 Pages | AZW3 | 2.4 MB Key Features Modularize your applications and make them highly reusable and testable Get familiar with complex concepts such as metaprogramming, concurrency, and immutability A highly practical guide to building functional code in C++ filled with lots of examples and real-world use cases Book Description Functional programming allows developers to divide programs into smaller, reusable components that ease the creation, testing, and maintenance of software as a whole. Combined with the power of C++, you can develop robust and scalable applications that fulfill modern day software requirements. This book will help you discover all the C++ 17 features that can be applied to build software in a functional way. The book is divided into three modules—the first introduces the fundamentals of functional programming and how it is supported by modern C++. The second module explains how to efficiently implement C++ features such as pure functions and immutable states to build robust applications. The last module describes how to achieve concurrency and apply design patterns to enhance your application's performance. Here, you will also learn to optimize code using metaprogramming in a functional way. By the end of the book, you will be familiar with the functional approach of programming and will be able to use these techniques on a daily basis. What you will learn Get to know the difference between imperative and functional approaches See the use of first-class functions and pure functions in a functional style Discover various techniques to apply immutable state to avoid side effects Design a recursive algorithm effectively Create faster programs using lazy evaluation Structure code using design patterns to make the design process easier Use concurrency techniques to develop responsive software Learn how to use the C++ Standard Template Library and metaprogramming in a functional way to improve code optimization About the Author Wisnu Anggoro is a Microsoft Certified Professional in C# programming and an experienced C/C++ developer. He has also authored the books Boost.Asio C++ Network Programming - Second Edition and Functional C# by Packt. He has been programming since he was in junior high school, which was about 20 years ago, and started developing computer applications using the BASIC programming language in the MS-DOS environment. He has solid experience in smart card programming, as well as desktop and web application programming, including designing, developing, and supporting the use of applications for SIM Card Operating System Porting, personalization, PC/SC communication, and other smart card applications that require the use of C# and C/C++. He is currently a senior smart card software engineer at CIPTA, an Indonesian company that specializes in innovation and technology for smart cards. He can be reached through his email at wisnu@anggoro.net. Table of Contents Diving into Modern C++ Manipulating functions in functional programming Applying immutable state to the function Recurring method invocation using recursive algorithm Procrastinating the execution process using Lazy Evaluation Optimizing code with Metaprogramming Running parallel execution using Concurrency Creating and debugging application in functional approach
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值