• 从赋值语句去理解命令式编程

    命令式编程一瞥
    服务器君一共花费 35.538 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    命令式编程语言

    所谓计算机程序,其实就是一份计算机照着执行的工作流程表。那些工作流程表都是一条条的祈使命令语句组成的。比如,先做这个,再做那个。在这种条件下做这个,在那种条件下,做那个。等等。这种命令式的、顺序执行的编程模型,叫做命令式编程(Imperative Programming),对应的编程语言自然就是命令式语言(Imperative Language)。

    汇编语言,就是命令式语言的一种。计算机在硬件结构上天生就是命令式的、顺序式的。 

    命令式编程模型简单直观,而且符合底层计算机硬件结构,因而大行其道,相应的,命令式语言也是当前的主流编程语言。当然,一般来讲,主旋律之外都少不了杂音。命令式语言之外,当然也少不了非命令式编程语言,比如,函数式编程语言(Functional Programming Language),就是一种与命令式语言概念区别甚大的一种非命令式编程语言。

    汇编语言是原初形式的命令式语言,其工作模型完全是建立在内存模型(包括寄存器在内)的基础上的。高级命令式语言虽然在表面概念上比汇编语言更加抽象,更加高端,但是,其内在运行模式仍然是建立在内存模型的基础之上的。 

    赋值语句

    首先,我们需要着重讲解命令式语言中最基本、最核心的语句——“赋值”语句。 

    赋值语句是命令式语言中最常见的语句,形式上看起来很简单,但是,概念上却极其复杂。我们必须从赋值语句的基本形式开始,一步步讲述其基本概念。

    在大部分的主流命令式编程语言中,“赋值”语句是用“等号”(=)来表述的。比如,在C、C++、Java、C#、Python、Ruby等命令式编程语言中,赋值语句都是用“=”这个符号来表述的。在这些语言中,“=”也叫做赋值符号。

    赋值符号(“=”)的左边部分,叫做左值。赋值符号(“=”)的右边部分,叫做右值。左值和右值的定义十分直观,很容易理解。但是,接下来的问题,却没有那么容易理解了。

    到现在为止,我们已经有了一条赋值语句的基本形式:左值 = 右值

    那么,左值和右值具体是什么呢?用编程术语来说,左值是变量名,右值是表达式。

    赋值语句就可以写成这样:变量名 = 表达式

    这就涉及到编程语言中两个十分重要的概念——变量和表达式。这两个词语源自于数学(代数)中的概念。编程语言借用这两个词语来表达编程模型中类似的概念。当然,在编程语言中,这两个词语带有了一些编程语言特有的特色,不像在代数中那么纯粹。

    表达式的概念相对来说纯粹一点,我们先来讲表达式的概念。

    我们可以把表达式理解为一个数学公式。可以十分简单,比如,可以就是一个数字,也可以十分复杂,比如,(1 + 2)* 15 / 26 – 13。 

    • 变量的概念相对来说就不那么纯粹了。一方面,编程语言的变量的概念与代数中的变量概念类似,变量名通常以字母开头,代表变化的数值。另一方面,编程语言的变量又具有自己的特色。下面我们就主要讲解编程语言中的变量的诸多特性。 

    变量的特性

    在编程语言的赋值语句中,变量名既可以出现在左边,也可以出现在右边的表达式。 比如,下述两个赋值语句。

    x = 1 
    y = x + 1 
    

    x和y都是变量名。x既可以出现在赋值符号(=)的左边,也可以出现在赋值符号(=)的右边。

    到现在为止,一切都显得那么和谐。上面的两条赋值语句看起来很正常,等号两边的变量或者表达式都满足相等的条件。“=”这个符号既表达了赋值符号的含义,又表达了“相等”的含义,与代数中的含义完全一致。看起来,一切都很顺利。但是,这只是假象。在编程语言中,赋值符号(=)丝毫没有“相等”的含义。之所以看起来好像“相等”,只是因为巧合而已。下面,我们再来看一条在代数中不可能成立的赋值语句。

    x = x + 1
    

    这种表达在代数中是不成立的,在命令式编程语言中,却是完全成立的。那么,这条语句代表了什么含义呢?

    我们前面说过,命令式语言是有顺序的、并且按照顺序执行的。赋值语句的执行过程是这样的,首先,执行赋值符号(=)右边的表达式,得出结果之后,再把结果存入赋值符号左边的变量名。

    那么,x = x + 1 这条语句的执行过程就是这样的。

    首先,计算机执行赋值符号(=)右边的表达式 x + 1。在执行这个表达式的时候,计算机首先要取得x的值,然后,再把这个值和1相加,得到一个结果数值。到此,右边表达式结束,计算机继续执行,将得到的表达式计算结果存入到x这个变量名。这条语句执行结束之后,最终,x的数值就比之前增加了1。比如,x之前是0,那么赋值语句执行之后就是1。如果x之前是15,那么赋值语句执行之后就是16。

    我们可以看到,x这个变量名具有两面性。一方面,x可以被计算机读取(计算机执行右边表达式的时候);一方面,x还可以被计算机写入(计算机执行赋值语句到最后一个步骤的时候)。

    在命令式编程语言中,所有的变量名都具有这种两面性。可以读,也可以写,因此,可能时时变化。这也符合了变量这个名词的字面含义——可以变化的数量值。与之相对的,就是常量这个名词。常量是具有固定数值的、不可改变的数量值。常量的概念比较简单,不再赘述。 

    初次接触编程语言的读者,通常会被赋值符号(=)的含义弄糊涂。所以,一定要记住,在绝大多数命令式编程语言中,“=”的含义不是“相等”,而是“赋值”。 

    在一些语法严格、定义规范的语言中,比如,Pascal语言,赋值符号并不是“=”,而是“:=”,即,等号前面多了一个冒号(“:”)。这种赋值符号的定义,有效地减少了概念上混淆的可能性。当然,这种赋值符号的定义方法带来了一个不便之处,那就是每次都要多写一个冒号。

    • 我的建议是,当你初次接触编程语言时,可以先从Pascal语言开始。当学会了简单的语法和编程概念之后,再转向其他主流编程语言。这样可以避免赋值符号带来的概念上的混淆。
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [PHP程序设计] 编程范式初探 3 个条目
  2. [PHP程序设计] PHP里的引用 5 个条目
  3. [移动开发] Android布局中的一些常用控件 2 个条目
  4. [智力开发与知识管理] 信息的类型与结构 9 个条目
  5. [智力开发与知识管理] 整体性学习策略 9 个条目
  6. [PHP程序设计] PHP里的布尔类型 3 个条目
  7. [移动开发] Android与SQLite数据库 7 个条目
  8. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  9. [移动开发] 简单了解Android Fragment 3 个条目
  10. [PHP程序设计] PHP扩展模块安装 1 个条目
  11. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  12. [移动开发] ListView 使用相关问题集 1 个条目
窗口 -- [八点]