使用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
在這裏看到:
我感覺這裏的東西是怎麼回事就在我的頭上。
我記得曾經在使用過一個編譯器輸出'long double'的地方(我遺憾地不記得細節),也許你遇到了同樣類型的問題。如果在輸出之前轉換爲double(即在最後一個循環輸出'(double)factorial [i]')中,你會得到什麼? – celtschk
謝謝,這個訣竅和程序現在的作品! – xelnos21