2014-01-26 74 views
2

使用C++ Primer Plus。我正在練習的第5章讓我有第二個練習我的工作前言本:使用類型的數組對象,而不是內置陣列 未定義的行爲使用long double而不是double

重做上市5.4和long double類型而不是長的長。找到100的價值! (階乘)

和有關上市:

// formore -- more looping with for 

#include <iostream> 

int main() 
{ 
    const int aSize = 100; 
    long long factorials[aSize]; 

    factorials[1] = factorials[0] = 1LL; 

    for (int i = 2; i < aSize; ++i) 
     factorials[i] = i * factorials[i-1]; 
    for (int i = 0; i < aSize; ++i) 
     std::cout << i << "! = " << factorials[i] << std::endl; 

    return 0; 
} 

我已經重寫了代碼,下面的練習說明和梳理出以下幾點:

// redo listing 5.4 using long double and arrays instead - find value of 100! 

#include <iostream> 
#include <array> 

int main() 
{ 
    int const ArSize = 100; 
    std::array<long double, ArSize> factorials = {1.0L, 1.0L}; 

    for (int i = 2; i <= ArSize; ++i) 
     factorials[i] = i * factorials[i-1]; 

    for (int i = 0; i <= ArSize; ++i) 
     std::cout << i << "! = " << factorials[i] << std::endl; 

    return 0; 
} 

當我嘗試並運行此代碼,我得到未定義的行爲。我很確定它與我正在使用的long double類型有關,因爲當我將factorial轉換爲double類型時,程序運行良好。究竟是什麼造成這種情況?

我道歉,如果我要問一個明顯的問題,它試圖谷歌工作,但大多數人似乎跳過它,只是代替練習3 ...

編輯

更改ArSize於:

const int ArSize = 101; 

For循環:

for (int i = 2; i < ArSize; ++i) 
    factorials[i] = i * factorials[i-1]; 

for (int i = 0; i < ArSize; ++i) 
    std::cout << i << "! = " << factorials[i] << std::endl; 

我還在UB;階乘[0]到階乘[3]顯示爲負數。 0

在這裏看到:

enter image description here

我感覺這裏的東西是怎麼回事就在我的頭上。

+0

我記得曾經在使用過一個編譯器輸出'long double'的地方(我遺憾地不記得細節),也許你遇到了同樣類型的問題。如果在輸出之前轉換爲double(即在最後一個循環輸出'(double)factorial [i]')中,你會得到什麼? – celtschk

+0

謝謝,這個訣竅和程序現在的作品! – xelnos21

回答

7

您在這裏界指派了,:

for (int i = 2; i <= ArSize; ++i) 
    factorials[i] = i * factorials[i-1]; 

這裏:

for (int i = 0; i <= ArSize; ++i) 
    std::cout << i << "! = " << factorials[i] << std::endl; 

,這是UB。 解決方案:不要訪問數組越界。

注意:這是不是做的雙或std::array。你改變了循環條件,引入了一個bug。

+0

我解決了這個問題,但我仍然得到UB,請參閱op – xelnos21

+0

@ xelnos21中的編輯它對我來說工作正常。 – juanchopanza

相關問題