2017-08-05 47 views
-10

我正在將一些C++代碼轉換爲Java,並使其更易於理解。奇怪的C++代碼,試圖破譯

這裏是行:

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

翻譯成Java,使之更容易理解,我已經寫了:

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

如果下一行是

Out[i] = Sum; 

或應該是

Out[i] = Inp[i]; 

問候, 霍華德

+0

你應該只增加** TapPtr **一次**。 –

+0

我會建議你不要對你的問題標籤這麼自由。 – miradulo

+1

我會學習Java編碼標準。 https://google.github.io/styleguide/javaguide.html。閱讀C++優先規則。 – duffymo

回答

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];,但與最後一行一樣,功能上與您所寫的內容相同。

+0

總和是雙倍。 Inp,Out和Tap是double的數組。 TapPtr和我是整數 – Howard

+0

謝謝。由於這些是內置類型,我不需要改變任何關於答案的內容。我會保留關於用戶定義類型的警告,以便我的答案保持一般。 –