莫衷一是——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”。

  总结:

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

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

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

  

  

时间: 2024-09-29 02:41:49

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

莫衷一是——i+++j 该如何计算?

这是一个有趣的计算 3 个加号相连.那么到底是如何结合的呢?是按照 i + (++j)来运算还是按照(i++) + j 来运算呢? 这个问题在类似于 C / C++中讨论是没有多大意义的因为 C / C++依赖于实现的硬件结构不同的环境结果也会不同.不过在 Java 中这个结果是固定的不受其运行的硬件环境与平台所影响. 到底按照什么顺序运算呢写个程序来测试下吧. [例]++的结合 如果结合为 则 i 的值会加 1结果 k 的值为 30如果结合为 则 j 的值会加 1结果 k 的值为 31.程序运

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

在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简单来说就是正着读和反着读都是一样的字符串,比如abba,noon等等,一个字符串的最长回文子串即为这个字符串的子串中,是回文串的最长的那个. 计 算字符串的最长回文字串最简单的算法就是枚举该字符串的每一个子串,并且判断这个子串是否为回文串,这个算法的时间复杂度为O(n^3)的,显然无法令人 满意,稍微优化的一个算法是枚举回文串的中点,这里要分为两种情况,一种是回文串长度是奇数的情况,另一种是回文串长度是偶数的情况,枚举中点再判断是否 是回文

第八届蓝桥杯 承压计算 (代码+详解)

承压计算 标题:承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同. 金属材料被严格地堆放成金字塔形. 7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 8 8 4 1 7 9 6 1 4 5 4 5 6 5 5 6 9 5 6 5 5 4 7 9 3 5 5 1 7 5 7 9 7 4 7 3 3 1 4 6 4 5 5 8 8 3 2 4 3 1 1 3 3 1 6 6 5 5 4 4 2 9 9 9 2 1 9 1

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

题目来自老师的课后作业,如下所示.很多地方应该可以直接调用函数,但是初学Python,对里面的函数还不是很了解,顺便带着学习的态度,尽量自己动手code. 测试版代码,里面带有很多注释和测试代码: [python] view plain copy # -*- coding: cp936 -*- import math import random import matplotlib.pyplot as plt import numpy as np ''''' 在x=[0,1]上均匀采样10个点组成

(KMP 1.2)hdu 1686 Oulipo(计算模式串在文本串中出现的次数)

题目: Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5985    Accepted Submission(s): 2404 Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition,

输入一个整数矩阵,计算位于矩阵边缘的元素之和

输入一个整数矩阵,计算位于矩阵边缘的元素之和.所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素. 源代码: #include<stdio.h> #include<stdlib.h> int main() { int m,n;//矩阵的长和宽 int sum = 0; printf("输入矩阵的长和宽\n"); scanf("%d%d",&m,&n); int a[m][n];//存储矩阵的值 //为矩阵

归并排序——计算逆序数

归并排序——计算逆序数 归并排序用了分治的思想,时间复杂度o(N*logN)动态内存的运用可减小空间开销: 归并排序还可用于计算逆序数: 逆序数:序列中位置和大小相反的一对数字: 逆序数=冒泡排序中相邻两个数字交换的次数: int a[maxn],n; long long ans; //逆序数一般很大,用long long void compute_ans(int*a,int begin,int mid,int end) { int len_L=mid-begin+1; int len_R=en

塞曼效应以及能级的计算

简单总结了一下在原子结构的基础上的Zeeman效应.很久之前就知道,这次算是复习,顺便计算一下.仅限于LS耦合,并且假设核自旋是0. 后面可能会考虑上核自旋非零的原子. 弱场下原子的Zeeman效应 把电子运动视为经典带电小球的圆周运动,按照电磁学,得到的磁矩为\(\boldsymbol{\mu}=q/(2m_e)\boldsymbol{\ell}\),其中\(q=-e\)为电子电荷,\(m_e\)为电子质量.该磁矩还可以改写为\(\boldsymbol{\mu}=q\hbar/(2m_e)\b

图像处理之三种常见双立方插值算法

http://blog.csdn.net/jia20003/article/details/40020775 图像处理之三种常见双立方插值算法 双立方插值计算涉及到16个像素点,其中(i', j')表示待计算像素点在源图像中的包含 小数部分的像素坐标,dx表示X方向的小数坐标,dy表示Y方向的小数坐标.具体 可以看下图: 根据上述图示与双立方插值的数学表达式可以看出,双立方插值本质上图像16个像素点 权重卷积之和作为新的像素值. 其中R(x)表示插值表达式,可以根据需要选择的表达式不同.常见有基