c ++为什么不在exponent时打印所有元素

问题描述 投票:2回答:3

我想创建一个数组并向该数组中的每个元素引发2并将其存储为新数组arr2。这是我的代码

#include <iostream>

using namespace std;

int main(){
  int arr1[7] = {1, 2, 3, 4, 5, 6, 7};

  auto arr2 = 2 ** arr1;

  cout << arr2 << endl;
}

但是,它只打印第一个元素,它不打印整个数组。为什么?所以,基本上,我在这里做的是用元素{1,2,3,4,5,6,7}创建arr1然后我想要arr2是

  • [2, 4, 8, 16, 32, 64, 128]

但由于某种原因,它只打印数组的第一个元素,它打印2,但我希望它打印所有元素。请注意,2 ** arr1是我将2提升为幂的行(使用取幂运算符,我认为如果我没有错,就是你如何调用它)然后它应该将数组存储在array2中。

有什么问题,为什么它只打印第一个元素而不是所有元素?

c++ arrays algorithm vector std
3个回答
1
投票

这个说法

auto arr2 = 2 ** arr1;

相当于

auto arr2 = 2 * *arr1;

表达式中的数组指示符(很少例外)转换为指向其第一个元素的指针。

所以上面的陈述可以改写成

auto arr2 = 2 * *( &arr1[0] );

由于arr1数组的第一个元素等于1,所以你有

auto arr2 = 2 * 1;

表达式2 * 1的类型为int

因此,语句可以像重写一样重写

int arr2 = 2;

在C ++中没有像**这样的运算符。相反,你必须使用标准功能pow

您可以通过手动编写适当的循环或使用标准算法std::transform来完成任务。

这是一个示范计划

#include <iostream>
#include <cmath>
#include <algorithm>
#include <iterator>

int main()
{
    int arr1[] = { 1, 2, 3, 4, 5, 6, 7 };
    int arr2[sizeof( arr1 ) / sizeof( *arr1 )];

    std::transform(std::begin(arr1), std::end(arr1),
        std::begin(arr2),
        [](int x) { return pow( 2, x ); });

    for (int x : arr1) std::cout << x << ' ';
    std::cout << std::endl;
    for (int x : arr2) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

它的输出是

1 2 3 4 5 6 7 
2 4 8 16 32 64 128 

7
投票

qazxsw poi不是指数运算符。 C ++不是Fortran。

你用**的第一个元素乘以2:你的陈述相当于arr。你输入的是完全合法的C ++(由乘法和指针取消引用组成),并且int arr2 = 2 * arr1[0];的使用增加了混淆。


0
投票

做你想做的事最简单的方法就是这样。

auto
© www.soinside.com 2019 - 2024. All rights reserved.