奇怪的C ++代码,试图破译

时间:2017-08-05 23:59:14

标签: java c++

我正在将一些C ++代码转换为Java,并使其更容易理解。

这是Line:

Out[i] = (Sum += Tap[TapPtr++] = Inp[i]);

翻译成Java并使其更容易理解,我写道:

Tap[TapPtr++] = Inp[i];
Sum = Sum + Inp[i];

下一行应该是

Out[i] =  Sum;

或应该是

Out[i] = Inp[i];

此致 霍华德

1 个答案:

答案 0 :(得分:1)

你没有指定类型,所以我假设这些都是内置的C ++类型,特别是算术类型(整数类型或浮点类型)。如果它是用户定义的类型,我不能保证我下面说的任何内容仍然适用。

T& lhs.operator=(T& rhs)是复制赋值运算符(它也可以是移动赋值,但在这种情况下不是)。 (规范)复制赋值运算符将rhs作为参数引用,将数据复制到lhs,并返回对lfs的引用。

T& lhs.operator++(int)是增量运算符(注意int,这是将后缀与前缀增量运算符分开的原因)。虽然T&是大多数内置类型的规范返回类型,但用户定义类型通常会返回T。无论哪种方式,后缀增量运算符都会增加lhs的值,但会返回原始值。

T& lhs.operator+=(T& rhs)是复合加法赋值运算符。它等同于表达式lhs=lhs+rhs,只是lhs只被评估一次。

所以相当于不会混淆代码

Out[i] = (Sum += Tap[TapPtr++] = Inp[i]);

将是

{
  auto tempTapPtr=TapPtr;
  ++TapPtr;
  Tap[tempTapPtr]=Inp[i];
  Sum+=Tap[tempTapPtr];
}
Out[i]=Sum;

如您所见,Java代码中的正确最后一行应为Out[i]=Sum;,但除非类型不是内置算术类型,否则Out[i]=Inp[i]在功能上是等效的。此外,Java代码的第二行不正确。它应该是Sum=Sum+Tap[TapPtr-1];,但与最后一行一样,在功能上等同于你所写的内容。