这是一个有趣的计算, 3 个加号相连。那么,究竟是怎样结合的呢?是依照: i + (++j)来运算,还是依照(i++) + j 来运算呢?

  这个问题在相似于 C / C++中讨论是没有多大意义的,由于 C / C++依赖于实现的硬件结构,不同的环境结果也会不同。只是在 Java 中,这个结果是固定的。不受其执行的硬件环境与平台所影响。

  究竟依照什么顺序运算呢,写个程序来測试下吧。

  【例】++的结合

 

  假设结合为:

  

  则 j 的值会加 1,结果 k 的值为 31。程序执行结果例如以下:

  

  从结果可知,结合的顺序为前者。也就是说

  

  相当于:



  为了更加清晰。这里使用括号。

  贪心规则

  这样的结合性要归根于编译器的贪心规则。也就是说,在分析符号的时候,编译器会尽可能多地结合有效的符号。比如上面的表达式:



  “ +”与“ ++”都是有效的符号。可是“ +++”不是有效的符号。因此,经过分析后,终于将表达式解析为:



  只是,编译器极度“贪心”。其仅仅管尽可能多地结合有效的符号。而无论这样结合是否符合语法的规则。比如表达式:



  本来,我们的原意是 a 减去−b,即:



  可是。假设之间不使用空格(或其它符合语法规则的空白分隔符)或括号进行分隔,经过分析之后。由于符号“ –”是有效的符号,所以会组合在一起。这样结构就划分为:



  这当然不符合语法规则,所以,编译器也会无情地产生了编译错误。

  为何贪心

  或许读者会问:为什么要使用这样的贪心的方式来分析字符呢?这样有什么优点呢?相信看过以下的样例,你就会明确了。

  【例】 贪心的解释。



  程序就是输出若干个八进制转义字符而已。貌似与贪心规则根本没有关系。假设这样想的话。那你错了,请看执行结果:



  想想看, 为什么 String 对象 “ \17”的长度为 1。“ \171”的长度也为 1 呢?还有, 为什么 “ \171”不打印出“ \17”的转义字符“ ”并与“ 1”连接成:



  而是打印出:



  呢?

那就是由于贪心规则,编译器会尽可能多地对有效字符进行结合,否则转义字符将失去作用。对于“ \1717”与“ \431”,会按两个字符来处理,由于这两个数值都超过了八进制转义字符的取值范围( \0~\377),因此,“ \1717”会解析为“ \171”与“ 7”,重点内容而“ \431”会解析为“ \43”与“ 1”。

  总结:

  编译器在分析字符时,会尽可能多地结合有效字符。

而且“过度”地贪心,而无论这样的结合方式是否符合语法规则。

  贪心规则是实用的。由于这样能够对转义字符等进行特殊处理。

  

  

本文出自柠檬派http://www.lemonpai.com 请务必保留此出处 ,否则将追究法律责任!

莫衷一是——i+++j 该怎样计算?的更多相关文章

  1. 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...

  2. UVA - 1625 Color Length[序列DP 代价计算技巧]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  3. C# 列主元素(Gauss)消去法 计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. C# 顺序高斯(Gauss)消去法计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. LK光流算法:提高计算精度和增加搜索范围

    LK光流算法:提高计算精度和增加搜索范围 关于LK算法的基本理论,见:http://www.cnblogs.com/dzyBK/p/4960630.html 这里主要阐述如何提高LK算法的计算精度和在 ...

  6. 计算字符串的最长回文子串 :Manacher算法介绍

    转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...

  7. 开源Math.NET基础数学类库使用(15)C#计算矩阵行列式

    原文:[原创]开源Math.NET基础数学类库使用(15)C#计算矩阵行列式                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...

  8. Python计算&绘图——曲线拟合问题(转)

    题目来自老师的课后作业,如下所示.很多地方应该可以直接调用函数,但是初学Python,对里面的函数还不是很了解,顺便带着学习的态度,尽量自己动手code. 测试版代码,里面带有很多注释和测试代码: # ...

  9. UVA - 1625 Color Length[序列DP 提前计算代价]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

随机推荐

  1. Linux版迅雷(Xware)安装配置方法

    Linux版迅雷下载请见:Xware下载 解压下载的压缩包 核对MD5或SHA1校验值 解压得到以下三个文件 安装文件 在/usr/local/下创建thunder文件夹,将上面的三个文件放入,然后运 ...

  2. [转]Tomcat中的Session小结

    阅读目录 什么是Session Session的目的 实现机制 Tomcat中的session实现 session存在的问题 什么是Session 对Tomcat而言,Session是一块在服务器开辟 ...

  3. [转]java:IO流学习小结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  4. 转 分享我在阿里工作十年接触过Java框架设计模式

    转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ...

  5. 更新中国地区ip列表

    鉴于高总的IPIP.net的数据库的准确性,推荐使用下列源: https://github.com/17mon/china_ip_list/blob/master/china_ip_list.txt ...

  6. 利用libsvm-mat建立分类模型model参数解密[zz from faruto]

    本帖子主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子. 测试数据使用 ...

  7. 孰优孰劣?Dubbo VS Spring Cloud性能测试大对决!

    最近我们试图从Dubbo迁移到Spring Cloud.为此对二者分别进行了性能测试.为了得出数据量不同的情况下的二者的性能表现,我们分别准备了一个25个属性pojo对象和一个50个属性的pojo对象 ...

  8. SQL分页参数传值 在存储过程中使用 动态SQL实现

    PROCEDURE [dbo].[SP_GetList] ( ), @arrearsStatus int, , --最小ID , --每页显示记录数 ) ) AS ); declare @strSQL ...

  9. [Windows Azure] Load Balancing Virtual Machines

    Load Balancing Virtual Machines All virtual machines that you create in Windows Azure can automatica ...

  10. SecurityError: Blocked a frame with origin from accessing a cross-origin frame

    问题描述:浏览器报错I am loading an <iframe> in my HTML page and trying to access the elements within it ...