莫衷一是——i+++j 该怎样计算?
这是一个有趣的计算, 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 该怎样计算?的更多相关文章
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- C# 列主元素(Gauss)消去法 计算一元多次方程组
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C# 顺序高斯(Gauss)消去法计算一元多次方程组
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- LK光流算法:提高计算精度和增加搜索范围
LK光流算法:提高计算精度和增加搜索范围 关于LK算法的基本理论,见:http://www.cnblogs.com/dzyBK/p/4960630.html 这里主要阐述如何提高LK算法的计算精度和在 ...
- 计算字符串的最长回文子串 :Manacher算法介绍
转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...
- 开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
原文:[原创]开源Math.NET基础数学类库使用(15)C#计算矩阵行列式 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- Python计算&绘图——曲线拟合问题(转)
题目来自老师的课后作业,如下所示.很多地方应该可以直接调用函数,但是初学Python,对里面的函数还不是很了解,顺便带着学习的态度,尽量自己动手code. 测试版代码,里面带有很多注释和测试代码: # ...
- UVA - 1625 Color Length[序列DP 提前计算代价]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
随机推荐
- Linux版迅雷(Xware)安装配置方法
Linux版迅雷下载请见:Xware下载 解压下载的压缩包 核对MD5或SHA1校验值 解压得到以下三个文件 安装文件 在/usr/local/下创建thunder文件夹,将上面的三个文件放入,然后运 ...
- [转]Tomcat中的Session小结
阅读目录 什么是Session Session的目的 实现机制 Tomcat中的session实现 session存在的问题 什么是Session 对Tomcat而言,Session是一块在服务器开辟 ...
- [转]java:IO流学习小结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 转 分享我在阿里工作十年接触过Java框架设计模式
转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ...
- 更新中国地区ip列表
鉴于高总的IPIP.net的数据库的准确性,推荐使用下列源: https://github.com/17mon/china_ip_list/blob/master/china_ip_list.txt ...
- 利用libsvm-mat建立分类模型model参数解密[zz from faruto]
本帖子主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子. 测试数据使用 ...
- 孰优孰劣?Dubbo VS Spring Cloud性能测试大对决!
最近我们试图从Dubbo迁移到Spring Cloud.为此对二者分别进行了性能测试.为了得出数据量不同的情况下的二者的性能表现,我们分别准备了一个25个属性pojo对象和一个50个属性的pojo对象 ...
- SQL分页参数传值 在存储过程中使用 动态SQL实现
PROCEDURE [dbo].[SP_GetList] ( ), @arrearsStatus int, , --最小ID , --每页显示记录数 ) ) AS ); declare @strSQL ...
- [Windows Azure] Load Balancing Virtual Machines
Load Balancing Virtual Machines All virtual machines that you create in Windows Azure can automatica ...
- 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 ...