当前位置: 首页 > 面试题库 >

if(a-b <0)和if(a

越学文
2023-03-14
本文向大家介绍if(a-b <0)和if(a 相关面试题,主要包含被问及if(a-b <0)和if(a 时的应答技巧和注意事项,需要的朋友参考一下

a < b并且a - b < 0可能意味着两个不同的东西。考虑以下代码:

int a = Integer.MAX_VALUE;
int b = Integer.MIN_VALUE;
if (a < b) {
    System.out.println("a < b");
}
if (a - b < 0) {
    System.out.println("a - b < 0");
}

运行时,将仅打印a - b < 0。发生的事情a < b显然是错误的,但是a - b溢出并变为-1,这是负面的。

话虽如此,请考虑一下数组的长度确实接近Integer.MAX_VALUE。中的代码ArrayList如下所示:

int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
    newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
    newCapacity = hugeCapacity(minCapacity);

oldCapacity确实接近,Integer.MAX_VALUE所以newCapacity(是oldCapacity + 0.5 * oldCapacity)可能溢出并变成Integer.MIN_VALUE(即负数)。然后,将minCapacity 下溢 相减回正数。

此检查确保if不会执行。如果代码编写为if (newCapacity < minCapacity),则true在这种情况下(由于newCapacity为负)newCapacity将被强制执行,minCapacity而与无关oldCapacity

此溢出情况由下一个if处理。当newCapacity已经溢出,这将是trueMAX_ARRAY_SIZE定义Integer.MAX_VALUE - 8Integer.MIN_VALUE - (Integer.MAX_VALUE - 8) > 0true。将newCapacity因此被正确地处理:hugeCapacity方法返回MAX_ARRAY_SIZEInteger.MAX_VALUE

注意:这就是// overflow-conscious code此方法中的注释。



 类似资料:
  • 我正在读费多尔·皮库斯的这本书,他有一些非常非常有趣的例子,对我来说是一个惊喜。 特别是这个基准抓住了我,唯一的区别是,在其中一个基准中,我们在if中使用||,在另一个基准中,我们使用|. 我不会详细介绍书中解释的为什么后者更快的所有细节,但我的想法是,在较慢的版本和|(按位或)版本中,硬件分支预测器有两次错误预测的机会。请参见下面的基准测试结果。 所以问题是为什么我们不在分支中总是使用|而不是|

  • 问题内容: List listStr = new ArrayList (); 与 在我看来,使用的好处之一是它不检查列表的大小,然后将其与零进行比较,它只是检查列表是否为空。是否有任何其他的优点,因为我经常看到的,而不是在代码库?是否存在我不知道以这种方式检查的原因? 问题答案: 基本上,在某些列表的实现中,该方法检查大小是否为零(因此从性能的角度来看,它们实际上是等效的)。但是,在其他类型的列表

  • 问题内容: 我今天偶然地写了一些代码,当Eclipse一次不对我大吼时,我感到很惊讶。该代码对结构相等运算符()有双重使用,类似于下面的结构。 输出是 玩耍时,我注意到我除了不能使用任何类型。从这个布尔表达式是 简化为。 因此,忽略副作用等于。 谁能解释该语法如何暗示这一点? 编辑1: 在许多人解释了左联想性之后,我发现我的困惑在哪里。通常,我将“ 1”表示为true,将“ 0”表示为false,

  • 本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执

  • 问题内容: 为什么以下两个语句的结果不同? 编辑: 我应该补充一点,我怀疑将“ 0”第一条语句强制转换为要比较的布尔值-这应该与“‘0’== true”完全相同,显然这是不正确的。 问题答案: 首先,为了完整性: 是的,因为是一个非空字符串,这始终计算结果为: 字符串:如果参数为空字符串(其长度为零),则结果为 false; 否则为 false 。否则结果为 true 。 现在到。 这里将进行两次