【问题标题】:Printing array of doubles gives unexpected results打印双打数组会产生意想不到的结果
【发布时间】:2020-08-25 17:06:33
【问题描述】:

在我正在编写的程序中,我在从数组中打印数据时遇到了意外的输出。我试过浮动和双倍。代码如下:

#include <iostream>

int main()
{
    double vector[3]{ 193.09375 , 338.5411682 , -4.0 };
    double pVecX{ 193.09375 };
    double pVecY{ 338.5411682 };
    double pVecZ{ -4 };
    
    std::cout << std::dec << vector[1] << '\n' << vector[2] << '\n' << vector[3] << '\n' << '\n';
   
    std::cout << std::dec << pVecX << '\n' << pVecY << '\n' << pVecZ << '\n';

    system("Pause");
    return 0;
}

这是输出:

338.541
-4
1.42292e-306

193.094
338.541
-4
Press any key to continue . . .

问题: 我希望向量以与它们输入数组的方式相反的顺序打印。 (即使我要求 [1]..[2]..[3],它正在打印 [2]..[3]..[1](我认为这是顺序))

当数组的一部分时,数字“193.09375”变成了一个(看似)随机标记的数字,并且每次程序运行时都不同。

我正在阅读有关变量的信息,并了解存储在其初始化范围之外的变量可能会导致回绕,我只是不知道为什么会发生这种情况。 (我假设它是基于否定符号。)

我确信我错过了一些简单的东西,而且我还很新。

【问题讨论】:

  • 数组索引从 0 开始。
  • vector[3] 是错误的。虽然你可能有三个元素,但实际上只有 0、1、2 个索引。

标签: c++


【解决方案1】:

Arrays 索引从 0 开始。所以当你说vector[3] 时,你实际上已经越界了。

您只有 0、1 和 2 个索引或下标。虽然你确实有 3 个元素。 0 将引用您的第一个元素,1 将引用您的第二个元素,2 将引用您的 3 元素,依此类推。

(就像我在评论中提到的那样。)

你应该有这样的东西:

std::cout << std::dec << vector[0] << '\n' << vector[1] << '\n' << vector[2] << '\n' << '\n';

这应该可以解决您的问题。还可以考虑使用std::vector

还阅读了为什么你不应该使用system("Pause");

【讨论】:

    【解决方案2】:

    如其他答案中所述,大小为 3 的数组的有效索引是 0、1 和 2。使用任何其他索引都会调用未定义的行为。

    如果你使用循环,你也可以避免显式索引到数组中:

    for (auto v : vector)
      std::cout << std::dec << v << '\n';
    

    【讨论】:

      【解决方案3】:

      vector[3] 超出了数组的范围。程序的行为未定义。有效索引为 0、1 和 2。

      【讨论】:

        【解决方案4】:

        我希望向量以与它们输入数组的方式相反的顺序打印。

        为什么?您打印的索引按从低到高的顺序排列(&lt;&lt; 按源代码的顺序打印等)。如果要反转它们,则需要先打印最高索引2,然后是1,然后是0

        当数组的一部分时,数字“193.09375”变成了一个(看似)随机标记的数字,并且每次程序运行都不同。

        vector 数组从 02,而不是从 13。当您尝试访问vector[3] 时,这是未定义的行为,程序可能会打印任何最终出现的内存。每次运行程序时,内存中可能包含不同的东西,这是未定义行为的正常结果。

        【讨论】:

          【解决方案5】:

          C++ 中的数组是零索引的,这意味着第一个元素由索引 0 访问,例如

          int array[3] {5,6,7};
          

          所以数组[0] == 5,数组[1] == 6,数组[2] == 7。

          你得到一个随机数的原因是你试图打印一个从未定义过的数组元素。在上面我的数组的给定示例中,如果我尝试打印元素数组 [3],它对应于内存中的某个位置(它不是我的数组的一部分),可以用任何值填充,这称为未定义的 bahavior )。

          如果要打印出数组的每个元素,可以使用基于范围的 for 循环:

          for (auto a : my_array) std::cout << a << std::endl;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-16
            • 2019-04-05
            • 1970-01-01
            • 2021-12-28
            相关资源
            最近更新 更多