代码之谜(三)- 运算符

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

因此,“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 = a + 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)。 难道我会偷偷的告诉你 “其实很多语言都是这么做的”。

转载于:https://www.cnblogs.com/justjavac/archive/2012/11/16/codepuzzle-operator.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非培训的前端转行之路(根据个人真实经历)

我是歌谣 放弃很很难 但是坚持一定很酷 本文乃本人真实经历书写 希望对你的工作和学习有所帮助 感谢你得阅读 前言 我是歌谣,当然真名不是叫歌谣。 歌谣的原因 1. 歌谣可以传承很久 影响比较大 2. 歌谣可以让人心情愉悦 让人积极向上 3. 名字里面有个谐音 哈哈 …

c语言做贪吃蛇vs2015,熬书几个月,终于编出简易的贪吃蛇了,VS2013

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#include#define X 30#define Y 15void guozi(int *x, int *y);int main(void){char map[X][Y];int x;int y;//横纵坐标int i;int j;//标记蛇头int p, q;//标记蛇尾int t, d;//寻找蛇尾int n 4;//蛇的长度…

java零钱换整程序_贪心算法换零钱(java)

贪心算法思想贪心算法总是做出在当前看来做好的选择。也就是说贪心算法并不从整体最后考虑,他做出的选择只是局部最优选择。他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体…

[LeetCode] Sqrt(x)

Implement int sqrt(int x). Compute and return the square root of x. 牛顿迭代 1 class Solution {2 public:3 int sqrt(int x) {4 // Start typing your C/C solution below5 // DO NOT write int main() function6 double ans x;7 8…

c语言江宝钏实验六答案,C语言程序设计江宝钏著实验六答案

C语言程序设计江宝钏著实验六答案6.4 实验六 数组一、 实验目的与要求1. 掌握一维数组的定义、赋值和输入输出的方法。2. 理解一维数组的存储方法及下标的表示方法。3. 掌握与数组有关的算法(特别是排序算法 )。4. 掌握二维数组的定义、赋值和输入输出的方法。5. 理解二维数组的…

一文带你理解vue创建一个后台管理系统流程(Vue+Element)

我是歌谣 放弃很容易 但是坚持一定很酷 1前言 本文根据自己工作经历编写,若有不合理之处,欢迎吐槽 2定义 后台管理系统什么 对一个页面进行增删改查 是不是有点像,不重复定义 3第一次接触后台管理系统 第一次接触后台管理系统是某b站的一…

glibc的头文件 linux_求助,编译glibc头文件时出错

我用的软件包如下:binutils-2.16.tar.gzgcc-3.4.4.tar.bz2glibc-2.3.5.tar.gzglibc-linuxthreads-2.3.5.tar.gzlinux-2.6.14.1.tar.gz补丁:ioperm.c.diffflow.c.difft-linux.diff想编译交叉工具链,用的编译指令是这样的:[rootlocalhost build-glibc-headers]#../glibc-2.3.5/co…

多表查询的一些技巧

1、基本方法:From 后面可以接多个表名,表与表之间用逗号隔开,查询字段之间要加上表的名字。 例如:Select table1.column1, table2.column1 from table1, table2 2、表别名:可以为表设置别名,以简化输入&…

c语言 将结构体放在flash,如何将 结构体 的 数据 定义在flash里面,并如何读出来,求各位达人帮助……...

如题,本人不太熟悉GCC,特别是定义在flash和eeprom的数据,所以在做液晶的字库时遇到问题,讲解下思路:用查表的方式,定义一个结构体来装载字符的内码和字符数据。程序如下:/*********************…

“数万行代码“教你用html和css编写一个精美的网页

我是歌谣 放弃很容易 但是坚持一定很酷 1前言 作为一名前端开发工程师 开发一个完美的网页也是我们的必修课之一 逻辑写起来有时候不是那么的难 据说页面样式才是最难的一课 本文内容纯属自己个人观点 欢迎一起交流吐槽 2网页基础版(divcss) 我第一次接触…

C#中在主窗体中用ShowDialog方法显示子窗体的使用技巧

显示和关闭子窗体: 方法1:源代码: EatGood.FoodManageUI.MessageForm.ConfirmDelFeelkindOrFeelsForm feelkindform new MessageForm.ConfirmDelFeelkindOrFeelsForm(); //创建一个窗体对象 feelkindform.ShowDialog() ; //显示窗体 子窗体中…

cmd oracle sys登录_oracle忘记sys/system/scott用户密码的解决方法

一、忘记除SYS、SYSTEM用户之外的用户的登录密码。用SYS (或SYSTEM)用户登录。CONN SYS/PASS_WORD AS SYSDBA;使用如下语句修改用户的密码。ALTER USER user_name IDENTIFIED BY newpass;注意:密码不能全是数字。并且不能是数字开头。否则会出现:ORA-009…

汇编语言写c51延时程序,单片机延时程序实例讲解

在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,那就是延时程序。下面我凭记忆来讲解延时程序。课本上讲,1个机器周期6个状态周期12个时钟周期,而这个时钟周期与晶振频率有关。我们接下来要上的实验基本都是以12…

Data Analysis: What are the skills needed to become a data analyst?

今天看到一个讨论贴:如何成为一个牛逼的数据分析师?其中有一贴如此总结。全文如下:There are two classes of skills that are needed to be a successful data analyst: both soft and technical skills are needed. The core work flow fo…

一文带你理解如何解决工作中的需求

我是歌谣 放弃很容易 但是坚持一定很酷 1前言 在我们的开发过程中 会遇到一些开发的需求 怎么实现 怎么写 怎么做才最合理 2需求处理 拿到一个需求就和做数学题一样 我们要理清所有的关系 由于本文知识对需求进行阐述 所以就以vue为例子 2.1 需求1处理页面样式某页面跳转之后如…

tc溜溜865手机投屏卡_溜溜tcgames老版本(电脑玩手机游戏)-溜溜TC Games32位/64位旧版本PC下载V2.0.0官网安卓真机投屏-西西软件下载...

溜溜TC Games32位/64位旧版本PC是一款非常好用的手机游戏投屏工具,有了这款软件我们就可以将手机上的游戏画面投入到电脑上,大屏幕玩游戏,这样肯定会跟畅快,该软件是由成都杰华科技有限公司基于PC端研发的,从此电脑玩游…

c语言八个方向迷宫课程设计,【精品资料最新版】C语言课程设计-迷宫游戏.doc...

计算机技术基础课程设计C语言设计报告题目:完整的二维迷宫游戏学院:工商管理学院专业:信息系统与信息管理班级:050507姓名:孙月指导教师:张首伟设计日期:2004年12月10日题目:完整的二…

文件操作的小tips

freopen功 能: 替换一个流,或者说重新分配文件指针,实现重定向。 eg: freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); /* close the standard output stream */ fclose(stdout);若要返回到显示…

ant接口用什么天线_Ant-Basic天线基本知识讲

1天线1.1天线的作用与地位无线电发射机输出的射频信号功率,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去。电磁波到达接收地点后,由天线接下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机。可见&#xff0…