代码改变世界

小菜的前端编程散谈(3)

2015-09-16 11:27  周信达  阅读(193)  评论(0编辑  收藏  举报

小菜的前端编程散谈(3)

数据类型

在程序中要存储和表示不同的数据,这当然要使用不同的数据类型,所谓的类型就好像是一个数据的容器一样。打个比方,在日常生活中,我们使用杯子装水,使用碗盛饭,不同的东西使用不同的容器。计算机的世界里也是一样。
计算机的世界只有二进制,而二进制来存储数据,当然就是存在0和1的位(Bit)上,所以不同的类型的主要差异在于位上面的区别。这是类型的第一重意义。类型的第二个意义在于,明确表示数据的含义。比如整型类型用来表示数据,字符类型表示字符描述。
一般的程序中,会使用最基本的一些类型,比如 bool(有的也叫boolean)、int(有的也叫integer)、char或者string(字符串,也就是一段文本),这里大概说一下这几个类型:

  1. bool布尔类型,布尔类型一般表示真(true)或者假(false),也就是说,布尔类型实际上只描述两个值,所以,使用一个位(Bit)就够了(比如0表示false,1表示true)
  2. 整型,整型分常规整型和长整型,一般编程语言把常规整型定义为32位的长度,默认是有符号整数,最高一位表示正负,剩余31位表达0到2的31次方减1的整数范围。不过需要注意的是,比如,最大的32位整数2的31次方减1位2147483647,那么如果这个数加1会如何呢?这实际上等于越界,超过了最大数会变成最小数(改变了最高的正负位),而有的编程语言直接会报出越界错误。作为开发人员,需要时刻谨防数据越界,使用合理的方式进行数据检查
  3. 字符和字符串,字符在上一张就说过,每个字符为一个byte(字节),一个字节包含8个位。可以表达255种含义,对应ASCII编码表或者Unicode字符集合表。而一个字符串其实就是字符的集合(或者叫数组),比如“Hello World”这个字符串,其实就是由11个字符组成。

程序结构

函数

程序结构指的是一个程序是如何组成和如何执行的,在传统的C语言环境中,程序由一系列的定义组成,定义包含类型(自定义类型、后面会讲到)定义和函数定义。而程序的执行就是从Main函数开始。函数是程序的基本执行单元。所谓函数就是定义了一个名称,定义了一组参数(输入),定义了返回类型(输出,也可以不用返回数据,就是void),然后函数体里面进行处理。函数可以嵌套和递归,嵌套就是函数里面调用其他函数,递归就是函数调用自己的过程。这些都有必要了解一下。我举个现实中的例子:

string A(string message){
  return B(message);
}
string B(string message){
  return C(message);
}
string C(string message){
  return "This is your brick";
}

注意,这里我演示的例子是一个函数嵌套的例子,首先我们看定义,我们定义了三个函数,我把他们叫搬砖头,每个函数接受一个名字为message类型为string的参数用来表示接收的指令,返回string表示砖头结果。(明显看出函数3大要素,函数名,参数名和参数类型,返回类型),说完了函数定义再说函数实现,A接收到一个指令说要搬一块砖头,然后A把指令告诉B让B搬一块砖头,然后B又把指令转给C,然后C就返回This is your brick。这个结果实际上又往回传递给B然后传递给A最后传递给调用A函数的那个人。
在真正的程序中,函数的结构往往都比这个复杂,比如A中调用B,然后做一些事情然后调用C最后再返回。
还有一种情况,那就是函数调用自己,这个叫递归函数,递归函数是一种非常好用的比较实用型的容易理解的函数。具体含义(应该是有3个要素,才能符合一个标准的递归函数)去网上搜一下。我这里举一个例子来理解,拿最著名的斐波那契数列举例,求第N个数是多少?

int Fib(int n){
  if(n<=1){
    return 1;
  }
  return Fib(n-1) + Fib(n-2);
}

看上去应该很容易理解吧,你可以发现递归函数的一些特征,比如必须有一个基准点可以返回一个值,比如函数调用自己,并且逐渐靠近基准点。

其实关于函数的调用,在计算机中的处理指令一般都是入栈出栈操作,进入一个新的函数调用等于是压入一个函数栈,调用完一个函数等于是出栈操作。关于栈是什么后面会讲到。现在最好的是体会这个过程,在大脑中想象一颗倒着的树,最上层是函数调用者,往下就是各个子调用。自己想象一下,可以把函数调用理解成一棵树吗?我们生活中做的很多事情,你把它画成图,其实也可以是一棵树,好好发挥想象力想一下吧!

今天就到这里,提示一下:如果有了一点积累有了一点理解,不妨马上用代码把它写出来吧,光说没用光读没用,必须要写代码!

ps:下一次说一下程序控制流程了