`

代码之谜(三)- 运算符

阅读更多

本章是我『代码之谜』系列的第四篇,如果链接打不开可以在咱iteye找到以前的文章,http://justjavac.iteye.com/blog/1685559

 

从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来

因此,“1加2加3” 在计算机中被表述为:

(1 + 2) + 3      // a

或者

1 + (2 + 3)      // b

虽然我们通常写做 1 + 2 + 3,但是并不意味这它和我们数学中的 1+2+3 是等价的。

那么数学中的 1+2+3 到底表示的是 a 呢,还是 b 呢?

如果计算机的求值是左结合的,那么此表达式等价于第一种a; 如果是右结合的,那么此表达式等价于第二种b。

1 + 2 + 3 简单的理解就是 “把1、2、3加在一起”, 确实,在我们接触到的数学里面,就是把三个数加起来。 但是在编程语言中,却不仅仅这样。

就像前面说的那样,+号无法操作三个或者更多的数,参与加法运算的只能是两个数。

顺便说一句,正号、负号是一元运算符,虽然它们和二元运算符加、减用相同的符号, 但是他们却是不同的,所以不要想当然的认为 +4 就等价于 0+4,其实它们不是等价的,

+4 是一个整数,但是 0+4 是一个加法表达式,这个表达式的求值结果正好是 +4

在 java 中,我们可以写 short a = +4,但是当我们写 short a = 0 + 4 时则产生一个警告。

还有一个其它例子,同样是关于 short 的,

short b = 1;
short b = b + 4;   // 警告
short b += 4;      // 无警告

那么 1 + 2 + 3 是如何运算的呢? 在冯诺依曼体系架构的编程语言中, 这里有一个副作用——我习惯称那些“计算机的运算过程与程序员的大脑思考过程不一样时,则称为副作用”(虽然书本里面没有这么写过,但我一向这么认为), 本来你以为会是这样,结果计算机偏偏就不是这样做的,我称他为副作用。

如果看过前面的『语句与表达式』,这可以这么理解:

1 + 2 是一个表达式,它的返回值是 3。 这个表达式的返回值再参加到另一个表达式中 3 + 3,最后得出结果6。

我们用语句(Statement)来改写这段代码:

// 计算 1 + 2 + 3
var a = 1 + 2;
var b = b + 3;

如果我们用 lisp 语言对这个表达式求值,则没有副作用。

(+ (+ 1 2) 3)

如果你还没有懂,或者这个例子太有特殊性,那么我们换一个

5 > 4 > 3

在数学中,这个算式的值为 true。当我们用C语言来写这段代码,它返回的确实 false。

原因和上面的一样,大于号(>)是二元运算,它无法直接比较三个数,5 > 4 返回的结果是 true, 当用 true 和 3 比较时,true 被转换称 1,也就是 1 > 3,最终的结果自然就是 false 了。

总之,回归到了『语句与表达式』篇的那个观点:在编程语言中 每个表达式都有一个值

编程语言中的运算符和数学中的运算器虽然一样,但是它们却并不等同。 当你写程序时,要写给人看; 当你调试程序时,要学会用计算机的方式思考代码的含义。

我习惯于把运算符理解为函数,比如 2 + 5 其实就是 add(2, 5) 或者 2.add(5)。 难道我会偷偷的告诉你 “其实很多语言都是这么做的”。

22
7
分享到:
评论
4 楼 381895649 2012-11-02  
大规模
3 楼 coffeescript 2012-11-01  
@justjavac 太不重视咱iteye了。好像几天前就在csdn发表了吧,怎么现在才写到iteye?
2 楼 artdialog 2012-11-01  
当你写程序时,要写给人看; 当你调试程序时,要学会用计算机的方式思考代码的含义。
受教了!!
1 楼 nodejs 2012-11-01  
最近一直拜读jjc哥的文章。

相关推荐

    代码之谜(持续更新)1

    代码之谜(三)讨论了运算符的概念和应用。该篇博客旨在让读者更好地理解代码中的运算符。 6. 代码之谜(四)- 浮点数(从惊讶到思考) 代码之谜(四)讨论了浮点数的概念和应用,从惊讶到思考。该篇博客旨在让...

    java代码之谜运算符篇

    相比之下,使用复合赋值运算符"b += 4"则不会有这种问题,因为它会自动处理类型转换。 除了加法运算符,还有其他类型的运算符,如比较运算符,如大于号">"。在Java中,"5 > 4 > 3"这样的表达式会导致错误的理解,...

    scratch编程项目源代码文件案例素材-[猜字谜].zip

    这个“scratch编程项目源代码文件案例素材-[猜字谜].zip”是一个专门针对Scratch的源代码示例,它包含了一个名为“猜字谜”的游戏项目。通过分析和学习这个案例,我们可以深入了解Scratch编程的基本结构和原理,以及...

    scratch编程项目源代码文件案例素材-[Windows 9.14全新测试版].zip

    "游戏案例"标签意味着这些源代码文件可能包含了一些已经完成的游戏项目,比如平台跳跃游戏、解谜游戏或者简单的反应速度测试游戏。通过分析这些游戏的源代码,学习者可以学习如何利用Scratch构建游戏机制,如角色...

    scratch编程项目源代码文件案例素材-2.1.2录屏完整版代码.zip

    Scratch的编程核心在于各种颜色和形状的积木块,它们代表了不同的编程指令和控制结构,如运动(move)、外观(looks)、声音(sound)、事件(events)、控制(control)、侦测(sensing)、运算符(operators)和...

    scratch编程项目源代码文件案例素材-[无题].zip

    在Scratch中,编程通过拖拽彩色的编程块来实现,这些编程块代表了基本的编程指令和逻辑结构,如控制流(如循环和条件语句)、数据处理(变量和运算符)以及交互功能(事件和消息传递)。"无题.sb2"文件是Scratch项目...

    scratch编程项目源代码文件案例素材-[yuanquan].zip

    在"yuanquan"项目中,我们可以期待看到不同类型的积木,如运动、外观、事件、控制、侦测、运算符、数据和更多,这些积木对应着编程的基本逻辑结构,如循环、条件语句、函数调用等。 少儿趣味编程是Scratch的一大...

    scratch编程项目源代码文件案例素材-洋节.zip

    "洋节"主题可能涉及到各种节日元素,例如圣诞节、万圣节等,项目可能包含各种节日相关的互动游戏,比如角色扮演、解谜、收集物品等。通过分析和修改这个项目,学习者能够了解如何创建类似的交互式故事或游戏,同时...

    scratch编程项目源代码文件案例素材-高精度计算N!.zip

    这个压缩包“scratch编程项目源代码文件案例素材-高精度计算N!.zip”显然包含了使用Scratch编写的程序,用于实现高精度计算阶乘(N!)的功能。在这里,我们将深入探讨Scratch编程、阶乘计算以及如何在Scratch中实现...

    scratch编程项目源代码文件案例素材-巧解迷题.zip

    在 Scratch 中,编程主要通过拖拽积木块完成,这些积木块分为不同的类别,如动作、外观、声音、事件、控制、侦测、运算符、变量和用户定义的积木等。通过组合这些积木,我们可以编写出复杂的逻辑。 例如,"巧解迷题...

    scratch编程项目源代码文件案例素材-[黑白世界2].zip

    2. **编程脚本**:Scratch采用积木块的形式来编写代码,这些积木块分为不同类别,如运动、外观、事件、控制、运算符、变量和函数等。通过组合这些积木块,可以实现角色的各种行为,例如移动、旋转、改变颜色、响应...

    scratch编程项目源代码文件案例素材-[开保箱].zip

    这个压缩包文件"开保箱"是一个基于Scratch的编程项目,包含了源代码,可以作为一个教学案例或游戏项目来学习和实践。 该项目名为"开保箱",可能是一个小型的解谜游戏,玩家需要通过一系列操作来解开密码,打开保险...

    scratch编程项目源代码文件案例素材-[再见,2018——纪念篇].zip

    这些积木块代表了编程语言中的基本指令和函数,例如运动、外观、事件、控制、侦测、运算符、变量和数据等类别。用户可以通过拖拽和组合这些积木来创建复杂的程序逻辑。 "少儿趣味编程"是Scratch的一个核心理念,它...

    scratch编程项目源代码文件案例素材-乐高碎片L e g o.zip

    通常,这样的游戏可能包含拼图、建造或者解谜等元素,利用Scratch中的各种编程块来实现玩家与虚拟乐高积木的互动。 在Scratch中,编程主要通过拖拽颜色编码的编程块完成,这些块分为不同的类别,如运动、外观、事件...

    魔方-少儿编程scratch项目源代码文件案例素材.zip

    Scratch中的编程逻辑主要通过积木块实现,这些积木块分为不同的类别,如运动、外观、事件、控制、运算符、变量等。在“魔方.sb2”项目中,我们可以看到大量使用了“控制”类别的积木,如“当绿旗被点击”、“重复...

    JAVA谜思.doc JAVA 常见疑惑及解析

    在学习Java过程中,我们经常会遇到一些看似简单但实则暗藏玄机的问题,这些问题被称为“JAVA谜思”。这里我们将深入探讨两个这样的谜题,它们涉及到Java中的数学运算和浮点数精度。 首先,我们来看“表达式谜题”。...

    c++少儿编程专业教师使用资料

    ##### 第8课:密码锁之谜——if语句 - **读故事** - 通过故事情境介绍条件语句的概念。 - **2. 问题思考** - 思考如何使用条件语句实现不同的行为。 - **3. 算法分析** - 分析if语句的基本结构和使用场景。 - **...

    matlab开发-BinaryPuzzle

    2. **逻辑运算**:掌握二进制逻辑,包括与(&)、或(|)、非(~)等运算符,它们在确定按钮是否可操作和解谜逻辑中起到关键作用。 3. **用户交互**:了解如何使用MATLAB的图形用户界面(GUI)工具箱创建交互式界面...

    devc++小游戏-地牢

    游戏中,玩家可能会遇到各种挑战,如探索地图、战斗、解谜等,这些都是通过C++的逻辑控制实现的。通过这个游戏,开发者可以展示如何在C++中创建交互式程序,处理用户输入,以及用基本的图形界面来增强用户体验。 ...

    CodeBreaker-2:打破代码游戏

    《CodeBreaker-2:打破代码游戏》是一款基于C++编程语言开发的智力挑战游戏,旨在锻炼玩家的逻辑思维能力和编程技巧。在这个游戏中,玩家需要通过编写程序来破解由计算机生成的一系列编码谜题。接下来,我们将深入...

Global site tag (gtag.js) - Google Analytics