小于时增加,低于时减小

时间:2010-02-04 10:02:54

标签: language-agnostic programming-languages

出于好奇,是否有一种(语言无关的)方法将这两个通用语句组合成一个语句?

if (a < b) a += x;
else if (a > b) a -= x;

也可以用作

if (abs(b - a) < x) a = b;
else if (a < b) a += x;
else if (a > b) a -= x;

哦,既然我正在写这篇文章,我正在考虑这样的事情:

if (a != b) a += x * (a < b ? 1 : -1);

但这并没有真正有益于可读性。其他方式也许?

  • =普通语言,不是Brainfuck和喜欢或非常古老的语言

4 个答案:

答案 0 :(得分:6)

a += x * sgn(b-a)

sgn是签名函数的地方:

sgn x | x > 0      = 1
      | x < 0      = -1
      | otherwise  = 0

答案 1 :(得分:3)

你真的想知道为什么要这样,编译器会做很好的优化,而且给定的语句非常易读。

答案 2 :(得分:1)

语言独立有点棘手,但如果你有cmp或类似的,你可以使用:

a += x * cmp(b, a)

cmp(b,a)返回:

  • 0如果b == a
  • 1,如果b>一个
  • -1如果&lt; B'/ LI>

此外,您建议的实施中存在错误:

a = 9;
b = 10;
x = 2;

if (a < b) a += x;
if (a > b) a -= x;

print a;

输出:9(预期11)

您需要else来解决此问题。或者,如果您想阻止a超过b,请执行以下操作:

if (a < b)
{
   a = min(b, a + x);
}
else if (a > b)
{
   a = max(b, a - x);
}

如果您想在一个表达式中执行此操作,您可以:

a = (a < b) ? min(b, a + x) : max(b, a - x);

我认为第一种方式更清晰。

答案 3 :(得分:0)

a += (b - a) / abs(b - a) * x

但这不是语言独立的,如果你问我,它并不能真正帮助你准备......