gpt4 book ai didi

c++ - 使用 long double 但不使用 double 的未定义行为

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:14 25 4
gpt4 key购买 nike

学习 C++ Primer Plus。我正在做第 5 章的练习。让我先做第二个练习:

Redo Listing 5.4 using a type array object instead of a built-in array and type long double instead of long long.Find the value of 100! (factorial)

以及有问题的列表:

// 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 类型有关,因为当我将阶乘转换为 double 类型时,程序运行正常。究竟是什么原因造成的?

如果我问的是一个明显的问题,我深表歉意,它试图用谷歌搜索这个练习,但大多数人似乎都跳过它而只是做练习三......

编辑

将 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

我觉得这里有什么东西正在我头上。

最佳答案

你在这里分配越界,:

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。解决方案:不要越界访问数组。

注意:它与 double 或 std::array 无关。您更改了循环条件,引入了错误。

关于c++ - 使用 long double 但不使用 double 的未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com