【问题标题】:c++ why dont print all elements when exponentc ++为什么在指数时不打印所有元素
【发布时间】:2017-12-27 10:51:13
【问题描述】:

我想创建一个数组并将该数组中的每个元素提升 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++ 中没有指数运算符。为什么要猜测语法?
  • 你需要一个或多个these
  • @StoryTeller。谢谢先生的解释。我一定会学的。

标签: c++ arrays algorithm vector std


【解决方案1】:

**不是指数运算符。 C++ 不是 Fortran。

您将arr 的第一个元素乘以2:您的语句等效于int arr2 = 2 * arr1[0];。您输入的是完全合法的 C++(包括乘法和指针解引用),而使用 auto 会增加混淆。

【讨论】:

  • 谢谢,看来你是对的,我一直想知道为什么**对两个常量不起作用
  • 这应该加入--&gt;“运营商”拥有的专属俱乐部。
  • @StoryTeller :也是“转换为布尔”运算符:!!
【解决方案2】:

此声明

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 

【讨论】:

    【解决方案3】:

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

    #include<iostream>
    #include<math.h>
    using namespace std;
    int main(){
          int arr1[7] = {1,2,3,4,5,6,7}, arr2[7];
          for(int i = 0; i<7; i++){
              arr2[i] = pow(2, arr1[i]);    //arr2 will be created.
              cout<<arr2[i]<<" ";           //Show arr2.
              }
    }
    

    【讨论】:

    • 是的,谢谢,其他的答案已经解释的很好了,但是你的答案也是有效的,所以谢谢。
    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多