java代码之谜运算符篇

 更新时间:2012年11月16日 15:23:02   作者:  
从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来
从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来。
因此,“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)。 难道我会偷偷的告诉你 “其实很多语言都是这么做的”。

相关文章

  • 解析Java的InputStream类并借助其读取ppt文件

    解析Java的InputStream类并借助其读取ppt文件

    这篇文章主要介绍了Java的InputStream类并借助其读取ppt文件,讲到了InputStream类中一些常用的方法的问题,需要的朋友可以参考下
    2015-11-11
  • SpringBoot 中 AutoConfiguration的使用方法

    SpringBoot 中 AutoConfiguration的使用方法

    这篇文章主要介绍了SpringBoot 中 AutoConfiguration的使用方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Java中Finally关键字

    Java中Finally关键字

    与其他语言的模型相比,finally 关键字是对 Java 异常处理模型的最佳补充。接下来通过本文给大家介绍Java中Finally关键字及finally关键字的使用相关知识,感兴趣的朋友一起学习吧
    2016-05-05
  • android中GridView的用法示例

    android中GridView的用法示例

    这篇文章主要介绍了android中GridView的用法,对于Android初学者很有参考学习价值,需要的朋友可以参考下
    2014-08-08
  • gson对象序列化的示例

    gson对象序列化的示例

    本文介绍如何将Java对象序列化为Json文件,然后读取该Json文件读取回Java对象。在下面的示例中,我们创建了一个Student类。然后生成一个student.json文件,该文件将具有Student对象的json数据。
    2020-11-11
  • Java  队列 Queue 用法实例详解

    Java 队列 Queue 用法实例详解

    本文实例讲述了Java内置队列类Queue用法,分享给大家供大家参考
    2017-04-04
  • idea中引入了gb2312编码的文件的解决方法

    idea中引入了gb2312编码的文件的解决方法

    这篇文章主要介绍了idea中引入了gb2312编码的文件的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • spring如何通过FactoryBean配置Bean

    spring如何通过FactoryBean配置Bean

    这篇文章主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • java正则表达式简单应用

    java正则表达式简单应用

    这篇文章主要介绍了java正则表达式简单应用,在之前几篇文章中已经深入学习了java正则表达式基础知识,本文对java正则表达式应用进行研究,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • java常见的序列化方式

    java常见的序列化方式

    这篇文章主要为大家详细介绍了java中两种常见的序列化方式,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论