Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java减去两个整数,结果应至少为零_Java - Fatal编程技术网

Java减去两个整数,结果应至少为零

Java减去两个整数,结果应至少为零,java,Java,我想从一个整数减去另一个整数,结果应该是0。所以2减4应该等于0。我可以这么做 int result = x - y; if (result < 0) result = 0; int结果=x-y; 如果(结果

我想从一个整数减去另一个整数,结果应该是0。所以2减4应该等于0。我可以这么做

int result = x - y;
if (result < 0) result = 0;
int结果=x-y;
如果(结果<0)结果=0;

但是还有更优雅的方法吗?

使用三元运算符
?:

int result = Math.max(0, x - y);
int result = (x - y) > 0 ? (x - y) : 0;

虽然很多人都在匆忙推出
Math.max(…)
解决方案,但我想提供一个简单的if语句

if (y > x) {
  result = 0;
} else {
  result = x - y;
}
它保证总是返回一个提升为0的结果,它不需要调用额外的堆栈帧(输入Math static函数会),并且它可以防止下溢

在罕见的情况下,X接近最小int,并且y足够大,计算(X-y)将导致下溢。结果将是一个负数“太大”,不适合整数的空间,因此将变成一个无意义的(可能是肯定的)答案


通过强制if语句确保不存在下溢,此解决方案也比
Math.max(…)
解决方案更正确。然而,大多数人并不在意,因为他们很少处理接近造成溢出和下溢的数字。

这是条件运算符。。。它恰好是一个三元运算符。如果x或y是函数调用,这也不好。@这是为什么说如果第二个和/或第三个操作数是函数调用,这就不好了?@edalorzo:因为函数会执行两次-这不太可能,而且可能会造成严重的副作用。@trinithis:这是一个条件运算符,但为什么不呢?至少它避免了您的解决方案中的错误,而且看起来可能更优雅。但是:在Java中,x和y不能是函数调用。@在这种情况下,只有当条件的计算结果为true时,它们才会执行两次。无论如何,我明白你的观点并同意你的观点,尽管在这种情况下这是不相关的,因为两个操作数都不使用metod调用。顺便说一句,JLS也将此运算符称为三元条件运算符(第526页)。实际上,这是OP所述问题的一个不太正确的解决方案。此外,Math.max很有可能足够小,JIT编译器将其内联。@Stephen,OP与Math.max()解决方案一样受到下溢的影响。这是因为你不能保证在减法后不会出现下溢,你必须在减法前检查一下。让X=Integer.MIN_INT和Y=8,你将下溢(可能返回一个正数,然后你将其视为答案)。我知道这一点。但是OP的问题是。。。如前所述。。。这需要实现。它清楚地说“减去两个数字”,而不是“找出两个数字之间的差异”。你已经改变了问题。这可能是OP最终需要的。。。或者不是。