莫衷一是——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很想,计算这 ...
随机推荐
- Java批量插入更新操作
以前总是说批量插入和更新的效率比非批量的要高,但是一直没有使用过批量处理数据的功能,现在由于项目中需要处理的数据量比较大,所以使用了批量处理的功能,java代码如下: 1.java实现批量插入数据: ...
- jQuery的dialog弹窗实现
jQuery实现dialog弹窗: html代码如下: <input type="button" onclick="performances();" va ...
- php分享二十二:php面向对象
1:static访问符 在类中使用static有两种主要用途.定义静态成员和定义静态方法.静态成员只保留一个变量的值,这个值对所有实例都是有效的 类的方法是static的,他所访问的属性也必须是sta ...
- 网络协议-网络分层、TCP/UDP、TCP三次握手和四次挥手
网络的五层划分是什么? 应用层,常见协议:HTTP.FTP 传输层,常见协议:TCP.UDP 网络层,常见协议:IP 链路层 物理层 TCP 和 UDP 的区别是什么 TCP/UDP 都属于传输层的协 ...
- [Leet Code]Path Sum
很简单一道题,搞错了N次,记录一下. public class Solution { private int currSum = 0; public boolean hasPathSum(TreeNo ...
- eclipse下SVN subclipse插件
本文目的 让未使用过版本控制器软件或者未使用过subversion软件的人员尽快上手. subversion的使用技巧很多,这里只总结了最小使用集,即主要的基本功能,能够用来应付日常工作. 因此不涉及 ...
- [nginx]站点目录及文件访问控制
nginx.conf配置文件 http ->多个server -> 多个location ->可限制目录和文件访问(根据i扩展名限制或者rewrite.) 根据目录或扩展名,禁止用户 ...
- https://jzh.12333sh.gov.cn/jzh/
https://jzh.12333sh.gov.cn/jzh/ https://superuser.com/questions/171917/force-a-program-to-run-withou ...
- (原创)舌尖上的c++--相逢
引子 前些时候,我在群里出了一道题目:将变参的类型连接在一起作为字符串并返回出来,要求只用函数实现,不能借助于结构体实现.用结构体来实现比较简单: template<typename... Ar ...
- zookeeper的原理讲解
留着以后看:http://blog.csdn.net/u010311445/article/category/1677839