zoukankan      html  css  js  c++  java
  • 莫衷一是——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”,会按两个字符来处理,由于这两个数值都超过了八进制转义字符的取值范围( ~377),因此,“ 1717”会解析为“ 171”与“ 7”,重点内容而“ 431”会解析为“ 43”与“ 1”。

      总结:

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

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

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


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

  • 相关阅读:
    [洛谷P2463][SDOI2008]Sandy的卡片
    后缀数组
    周记【距gdoi:110天】
    hdu3068最长回文(Manacher算法)
    二分图的一些题目合集
    周记【距gdoi:117天】
    二分图、网络流模版总结
    2014end
    周记【距gdoi:126天】
    2-sat
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7374747.html
Copyright © 2011-2022 走看看