出自《java puzzle》
你能否举出这样一个合法的Java表达式,只要对它的某个子表达式加上括号就可以使其成为不合法的表达式,而添加的括号只是为了注解未加括号时赋值的顺序?
插入一对用来注解现有赋值顺序的括号对程序的合法性似乎是应该没有任何影响的。事实上,绝大多数情况下确实是没有影响的。但是,在两种情况下,插入一对看上去没有影响的括号可能会令合法的Java程序变得不合法。这种奇怪的情况是由于数值的二进制补码的不对称性引起的。 你可能会联想到,最小的int型负数其绝对值比最大的int型正数大1:Integer.MIN_VALUE是-231,即-2,147,483,648,而Integer.MAX_VALUE是231-1,即2,147,483,647。
Java不支持负的十进制字面常量;int和long类型的负数常量都是由正数十进制字面常量前加一元负操作符(-)构成。这种构成方式是由一条特殊的语言规则所决定的:在int类型的十进制字面常量中,最大的是2147483648。而从0到2147483647的所有十进制字面常量都可以在任何能够使用int类型字面常量的地方出现,但是字面常量2147483648只能作为一元负操作符的操作数来使用[JLS 3.10.1]。
一旦你知道了这个规则,这个谜题就很容易了。符号-2147483648构成了一个合法的Java表达式,它由一元负操作符加上一个int型字面常量2147483648组成。通过添加一对括号来注解(很不重要的)赋值顺序,即写成-(2147483648),就会破坏这条规则。信不信由你,下面这个程序肯定会出现一个编译期错误,如果去掉了括号,那么错误也就没有了:
public class PoisonParen {
int i = -(2147483648);
}
类似地,上述情况也适用于long型字面常量。下面这个程序也会产生一个编译期错误,并且如果你去掉括号错误也会消失:
public class PoisonParen {
long j = -(9223372036854774808L);
}
分享到:
相关推荐
利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。输入一个包含上述括号的...
在JavaScript中,大括号{}和中括号[]是非常基础且重要的符号,它们分别用于定义对象和数组。下面将详细讲解这两种符号的使用方法以及它们在实际开发中的应用。 首先,我们来看大括号{},它在JavaScript中有两个主要...
表达式括号匹配配对判断问题 表达式括号匹配配对判断问题是计算机科学中的一种经典问题,旨在判别一个算法表达式中的括号是否正确匹配。本问题的解决方案可以使用栈数据结构来实现。 问题的描述是:假设一个算法...
括号匹配是编程领域中一个基础且重要的概念,主要涉及到字符串处理、算法和数据结构——尤其是栈的应用。在处理表达式、代码解析或文本格式验证时,括号匹配是必不可少的工具。本主题将深入探讨如何验证括号的正确性...
在C++编程中,括号匹配是一个至关重要的概念,它涉及到程序的正确性与语法合法性。括号匹配通常指的是确保程序中的所有开启括号(如`(`、`[`、`{`)都有对应的关闭括号(`)`、`]`、`}`)。在C++中,括号用于控制代码...
"IDEA花括号插件"正是为了解决这一问题,它通过将邻近的括号用不同颜色高亮显示,使得代码结构更易识别,帮助开发者迅速定位括号对,减少在查找括号上花费的时间。 此插件的具体功能包括: 1. **颜色区分**:不同...
顺序栈实现括号配对 在计算机科学中,括号配对是指在一个表达式中,各种括号之间的匹配关系。例如,在一个数学表达式中,我们可以使用小括号、中括号和大括号来表示不同的操作优先级。然而,在实际应用中,我们需要...
### 表达式的括号匹配检验问题 #### 一、问题背景及定义 在计算机科学领域,括号匹配是一项常见的编程任务,它涉及到表达式的合法性验证。本问题旨在设计一个程序,该程序能够检查给定表达式中的括号是否正确配对...
括号匹配问题是一种常见的计算机科学问题,主要涉及数据结构和算法的设计。在编程领域,它经常出现在解析表达式、编译器设计、树结构处理等场景。本问题的核心是检查给定的一组括号(通常是圆括号"()"、方括号"[]"和...
某个序列完全由圆括号组成,一个“(”和“)”称为一对括号,且序列中的括号成对出现。设n为序列中出现的括号对数,k为序列中括号的最大嵌套深度;那么,序列“((()()()))()(())”的n为8,k为3,请...
5. **递归处理**:对于嵌套的括号,可以使用递归的方式,先处理最内层的括号,然后逐步处理外层的括号,直到整个表达式没有多余的括号。 6. **输出结果**:遍历结束后,得到的字符串即为去除了多余括号的表达式,...
在这个问题中,我们需要检查一个字符串表达式中的括号(圆括号“()”、方括号“[]”和大括号“{}”)是否按照正确的规则配对。正确配对的规则是开括号必须有对应的闭括号,并且闭括号必须在其对应的开括号之后出现。...
在编程领域,括号匹配是一项基础且重要的任务,特别是在处理表达式、代码解析或编译器设计时。本文将深入探讨“左右括号匹配”这一主题,并以C语言为例,阐述其实现方法。 首先,我们要理解什么是括号匹配。括号...
"vb6删除字符串括号及里面内容"这个主题涉及到如何有效地从字符串中移除特定类型的括号(通常是方括号`[]`、圆括号`()`或花括号`{}`)以及它们包围的任何内容。以下是一些关键知识点: 1. **字符串变量**:VB6中的...
假设一个算术表达式中包含圆括号、方括号两种类型的括号,试编写一个判断表达式中括号是否匹配的程序,匹配返回Match succeed!,否则返回Match false!。 例 [1+2*(3+4*(5+6))]括号匹配 (1+2)*(1+2*[(1+2)+3)...
假设一个算术表达式中包括圆括号、方括号和花括号三种形式的括号,判别表达式中括号是否正确配对。 对于输入的表达式,输出以下四种结果之一: 1、左右括号匹配正确 2、左右括号配对次序不正确; 3、右括号多于左...
这些伪元素也可以用作创建大括号的一部分,特别适用于复杂的大括号形状。 6. **动画效果**:如果需要动态显示大括号,可以使用CSS3的`transition`或`animation`属性来创建平滑的过渡或动画效果。 在提供的压缩包中...
在编程领域,括号的配对问题是一个经典的数据结构与算法问题,主要涉及到栈这一数据结构的应用。本文将深入探讨如何解决"大小括号算术_栈"的问题,以及相关的核心知识点。 首先,我们需要理解括号配对的基本规则:...
给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的...